У меня есть простая программа cli, которая получает MAC-адрес и имя компьютера, создает строку сообщения, содержащую эту информацию, и пытается отправить ее через POST с помощью метода .net WebBrowser.Naviate. Кажется, что все работает, за исключением отправляемых данных POST. Всякий раз, когда я распечатываю содержимое массива PHP Post, я получаю пустой массив. Я где-то пропустил шаг?
Консольное приложение C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management;
using System.Net.NetworkInformation;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Web;
using System.Windows.Forms;
using System.Threading;namespace machine_boot
{
class Program
{
static void Main(string[] args)
{
try
{
// Get the system mac address
string theMac = GetMacAddress();
System.Threading.ThreadStart objThreadStart = delegate
{
string postData = "mm=" + theMac + "&mn=" + System.Environment.MachineName;
WebBrowser browserObject = new WebBrowser();
browserObject.Navigate(
"https://siteurl.com/test.php",
"_blank",
System.Text.Encoding.UTF8.GetBytes(postData),
"Content-Type: application/x-www-form-urlencoded" + Environment.NewLine
);
};
Thread theThread = new Thread(objThreadStart);
theThread.SetApartmentState(ApartmentState.STA);
theThread.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Contact an administrator");
Console.WriteLine();
Console.WriteLine("Press any key exit...");
Console.ReadLine();
}}
/// <summary>
/// Finds the MAC address of the NIC with maximum speed.
/// </summary>
/// <returns>The MAC address.</returns>
static string GetMacAddress()
{
const int MIN_MAC_ADDR_LENGTH = 12;
string macAddress = string.Empty;
long maxSpeed = -1;
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
string tempMac = nic.GetPhysicalAddress().ToString();
if (nic.Speed > maxSpeed &&
!string.IsNullOrEmpty(tempMac) &&
tempMac.Length >= MIN_MAC_ADDR_LENGTH)
{
maxSpeed = nic.Speed;
macAddress = tempMac;
}
}
return macAddress;
}
}
/*
* The class we map the json server response to
*/
[DataContract]
public class ServerResponse
{
[DataMember]
public string machineurl { get; set; }
}
}
siteurl.com/test.php
echo "<pre>";
echo var_export($_POST, true);
ОБНОВИТЬ
Я нашел файл access.log для apache и провел некоторые эксперименты. Я нашел первоначальный запрос POST:
"POST /test.php HTTP/1.1" 200 0 325 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
Затем я удалил второй параметр get из переменной postData, чтобы увидеть, изменился ли размер запроса, что, как вы можете видеть ниже, изменилось:
"POST /test.php HTTP/1.1" 200 0 296 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
Итак, я знаю, что выполняется запрос POST, и что данные POST содержатся внутри запроса. Может ли быть проблема с анализом apache байтового массива? Также стоит отметить, что каждый раз, когда делается запрос POST, сразу же делается дополнительный запрос GET, после чего я подумал, что это странно:
"POST /test.php HTTP/1.1" 200 0 325 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko""GET /test.php HTTP/1.1" 200 0 269 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
Я думаю, что вы должны потерять ?
в начале postData
,
Вопросительный знак используется для отделения пути от параметров запроса в запросе GET.
Для запроса POST, в частности применение / х-WWW-форм-urlencoded что вы используете, вам просто нужно передать URL-кодированные параметры, формируя key=value
пары, разделенные &
, Нет необходимости ?
,
Также попробуйте изменить последний аргумент на "Content-Type: application/x-www-form-urlencoded" + Environment.NewLine
,
Других решений пока нет …