2009-07-04 3 views
3

Wie die folgenden HTTP-Anforderungen in C#Warum sendet mein HTTP-Webanforderungscode keine Anforderung?

POST http://10.0.0.1/st_poe.cgi 

Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* 
Referer: http://10.0.0.1/RST_st_poe.htm 
Accept-Language: en-US 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
Host: 10.0.0.1 
Content-Length: 21 
Connection: Keep-Alive 
Pragma: no-cache 
Authorization: Basic YWStaW47c3Jsa3NobQ== 

ConMethod=++Connect++ 

Ich versuche schreiben es mit dem folgenden Code zu tun. Es funktioniert nicht.

  string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password)); 

      byte[] bytes = System.Text.Encoding.ASCII.GetBytes("ConMethod=++Connect++"); 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://10.0.0.1/st_poe.cgi"); 

      request.Method = "POST"; 
      request.Headers.Add("Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*"); 
      request.Referer = "http://10.0.0.1/RST_st_poe.htm"; 
      request.Headers.Add("Accept-Language: en-US"); 
      request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Headers.Add("Accept-Encoding: gzip, deflate"); 
      request.ContentLength = bytes.Length; 
      request.Headers.Add("Host: 10.0.0.1"); 
      request.Headers.Add("Connection: Keep-Alive"); 
      request.Headers.Add("Pragma: no-cache"); 
      request.Headers.Add("Authorization: Basic "+user); 


      Stream reqStream = request.GetRequestStream(); 

      reqStream.Write(bytes, 0, bytes.Length); 

      reqStream.Close(); 

Kann jemand darauf hinweisen, wo ich vermasselt bin. Ich verwende HttpWebRequest zum ersten Mal.

Antwort

12

Sie sollten die aktuelle Anfrage mit

var response = request.GetResponse(); 

Alternativ ausführen, können Sie die einfachere System.Net.WebClient-Klasse verwenden:

var client = new WebClient(); 
client.Headers["..."] = ...; 
// Use one of the DownloadXXX/UploadXXX methods. 
var responseBody = client.UploadData("Url", dataToUpload); 
+0

Ich wusste nicht, es war ein Methode namens Upload() abkühlen ich dachte, es() –

3

Mehrdad hat Recht. Ich werde nur hinzufügen, dass, wenn Sie HttpWebRequest bleiben gehen, dann müssen Sie lernen, verwenden Blöcke für jede Ressource „mit“ ordnen Sie, dass IDisposable implementiert:

var user = 
    Convert.ToBase64String(
     Encoding.UTF8.GetBytes(username + ":" + password)); 

var bytes = Encoding.ASCII.GetBytes("ConMethod=++Connect++"); 

var request = 
    (HttpWebRequest) WebRequest.Create("http://10.0.0.1/st_poe.cgi"); 

request.Method = "POST"; 
request.Headers.Add(
    "Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*"); 
request.Referer = "http://10.0.0.1/RST_st_poe.htm"; 
request.Headers.Add("Accept-Language: en-US"); 
request.UserAgent = 
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.Headers.Add("Accept-Encoding: gzip, deflate"); 
request.ContentLength = bytes.Length; 
request.Headers.Add("Host: 10.0.0.1"); 
request.Headers.Add("Connection: Keep-Alive"); 
request.Headers.Add("Pragma: no-cache"); 
request.Headers.Add("Authorization: Basic " + user); 

using (var reqStream = request.GetRequestStream()) 
{ 
    reqStream.Write(bytes, 0, bytes.Length); 
} 

using (var response = (HttpWebResponse) request.GetResponse()) 
{ 
    using (var responseStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(responseStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
} 
+0

es nicht ungültig macht Ihre Behauptung upload nur möglich war, dass 'using' ein bequemes Konstrukt ist, sondern für wcf Communication, die IDisposable implementieren,' using' ist ein schneller Weg für die Uninitiiert, um die Tiefen des Wahnsinns auszuloten ... –

+0

@code: Ich bin mir dessen bewusst. Beachten Sie jedoch, dass WCF die einzige schwerwiegende Ausnahme ist, die ich kenne, und das liegt an einem Konstruktionsfehler in WCF. In jedem anderen Fall ist die Tatsache, dass eine Klasse implementiert IDisposable bedeutet, dass Sie sollten sicherstellen, entsorgen zu nennen, und in alle außer einem Fall, das bedeutet, dass Sie mit ziemlicher Sicherheit einen mit Block verwenden sollten. –

+0

Ohne ‚mit‘ oder auf der HttpWebResponse entsorgen rufen dann GET-Anfragen werden nach einer POST hängen, wenn die request.UserAgent Wert gegeben wird. Ich entdeckte dies mit irgendeinem HttpWebRequest-Code, der verwendet wurde, um zu überprüfen, ob eine Verbindung verfügbar war, wenn sie in Kombination mit RestSharp verwendet wurde. –