Пустой ответ от веб-клиента C# - PullRequest
3 голосов
/ 15 апреля 2020

Я пытаюсь получить данные от компрессора, но ответ всегда пуст. Вот мой код:

WebClient client = new WebClient();
client.Headers[HttpRequestHeader.ContentType]= "application/x-www-form-urlencoded";
string question = "online_pressure"; 
string URL = "http://10.0.163.51/getVar.cgi"; 
string answer = client.UploadString(URL, "POST", question);
Console.WriteLine(answer);

Когда я использую этот код для другого компрессора, который отличается только двумя строками, он прекрасно работает, и я вижу ответ в консоли:

string question = "QUESTION=300201"; 
string URL = "http://10.0.163.50/cgi-bin/mkv.cgi";

Код В VBS отлично работает оба компрессора. Я вижу ответ в MsgBox от первого и второго компрессоров:

Dim objHTTP
strToSend = "online_pressure"
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
Call objHTTP.Open("POST", "http://10.0.163.51/getVar.cgi", false)
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.Send strToSend
MsgBox(objHTTP.ResponseText)

Код HttpRequest работает только для второго компрессора:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;
    StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
    requestWriter.Write(data);
    requestWriter.Close();

    try
    {
        // get the response
        WebResponse webResponse = request.GetResponse();
        Stream webStream = webResponse.GetResponseStream();
        StreamReader responseReader = new StreamReader(webStream);
        string response = responseReader.ReadToEnd();
        responseReader.Close();
        Console.WriteLine(response);
    }
    catch (WebException we)
    {
        string webExceptionMessage = we.Message;
    }

Что я могу попробовать еще, чтобы получить данные из первого компрессора в C#?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Я сравнил три запроса в Fiddler 4 и понял, что единственное различие (кроме некоторых других заголовков, которые не влияют на поведение) между сценарием VBS и WebClient и HttpWebRequest заключается в том, что управляемые API отправляют заголовок Expect: 100-continue и Сценарий vbs не поддерживает.

Это может быть проблемой, если программное обеспечение, работающее на устройстве сжатия, не поддерживает это.

Пожалуйста, попробуйте следующее, что говорит HttpWebRequest не отправлять этот заголовок:

Для HttpWebRequest вы можете просто запретить отправку этого сообщения:

 request.ServicePoint.Expect100Continue = false;

Примечание: Для WebClient назначение требует доступа к объекту HttpWebRequest, используемому внутри, но это "защищено" доступ к модификатору и можно обойти.

Перед установкой этого значения:

POST http://oguzozgul.com.tr/getVar.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: oguzozgul.com.tr
Content-Length: 15
Expect: 100-continue
Connection: Keep-Alive

online_pressure 

После установки этого значения:

POST http://oguzozgul.com.tr/getVar.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: oguzozgul.com.tr
Content-Length: 15
Connection: Keep-Alive

online_pressure

Я также хочу поставить скрипт vb запросите здесь, чтобы вы могли увидеть и другие отличия. Accept-Encoding и некоторые другие заголовки также не отправляются по умолчанию:

POST http://oguzozgul.com.tr/getVar.cgi HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Accept-Language: tr,en-US;q=0.8,en-GB;q=0.7,en;q=0.5,zh-Hans-CN;q=0.3,zh-Hans;q=0.2
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Win64; x64; Trident/7.0; .NET4.0E; .NET4.0C; Tablet PC 2.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; wbx 1.0.0; Zoom 3.6.0; wbxapp 1.0.0)
Host: oguzozgul.com.tr
Content-Length: 15
Connection: Keep-Alive
Pragma: no-cache

online_pressure
0 голосов
/ 01 мая 2020

WebClient и HttpWebRequest по-прежнему не работают с этим компрессором. Я пытался добавить любые заголовки, но безрезультатно.

Я пробовал PowerShell, и он тоже возвращает пустой ответ:

Invoke-WebRequest -Uri http://10.0.163.51/getVar.cgi -Method POST -Body "package_discharge_pressure" -ContentType "application/x-www-form-urlencoded"

Завиток тоже не работает, он зависает без ошибок

curl -i -X POST -H "Content-Type:application/x-www-form-urlencoded" -d "sump_pressure" http://10.0.163.51/getVar.cgi

Javascript и VBS работает хорошо. И сегодня я нашел c# код, который тоже работает

WinHttpRequest req = new WinHttpRequest();
try {
    req.Open("POST", "http://10.0.163.51/getVar.cgi", true);
    req.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.Send("sump_pressure");
    req.WaitForResponse();
}
catch(Exception ex) {
    Console.WriteLine("Error : " + ex.Message.Trim());
}
Console.WriteLine(req.ResponseText);

В visual studio нужно сделать ссылку на WinHttp

...