2010-02-15 8 views
11

Ich möchte den Anfrage-Stream von einer benutzerdefinierten HttpWebRequest Klasse lesen, die von HttpWebRequest erbt und ich habe versucht, den Anfrage-Stream in verschiedenen Phasen zu lesen, aber immer noch nicht sicher, wie das in der Klasse zu erreichen.Wie zu lesen httpWebRequest Anfrage Stream in C#, ich habe Fehler "der Stream ist nicht lesbar"?

Diese benutzerdefinierte HttpWebRequest wird verwendet, um eine Soap-Nachricht zu serialisieren, und ich möchte wissen, welche Anfrage im String-Format gesendet wurde. Ich implementierte auch benutzerdefinierte HttpRequestCreator, HttpWebResponse, kann aber immer noch keinen Ort/Stufe finden, von dem ich den Anfrage-Stream lesen kann.

Wenn ich alles in einem MemoryStream ausgeben, dann kopieren Sie den Inhalt zu Anfrage Stream, weiß jemand, welche Stufe kann ich es tun? Im Konstruktor BeginGetRequestStream, EndGetRequestStream oder GetRequestStream?

+1

Was möchten Sie tun? – SLaks

+0

Bitte klären Sie Ihre Frage, wenn Sie Downvotes vermeiden möchten. Auch wenn Sie eine gute Antwort bekommen möchten. –

+0

Bitte poste deinen Code, ohne dass es schwierig ist zu sagen, was vor sich geht. – feroze

Antwort

10

Ihre Frage ist unklar.

Wenn Sie versuchen, eine HttpWebRequest 's Anfrage Stream nach anderen Code in den Stream geschrieben (eine POST-Anfrage) zu lesen, ist es nicht möglich. (Der Stream wird direkt an den Server gesendet und nicht im Speicher abgelegt.)

Stattdessen müssen Sie Ihren eigenen MemoryStream verfügbar machen und ihn dann in den Anfrage-Stream von HttpWebRequest schreiben, wenn Sie bereit sind, die Anfrage zu senden.

+0

vielen dank für die antwort, konntest du mich wissen lassen, welche stufe/methode ich meinen memorystream aussetzen kann? danke nochmal – sam

13

Der "Stream ist nicht lesbar" wird ausgegeben, wenn ein Fehler zurückgegeben wird, wie 404, 503, 401 und so weiter. Wahrscheinlich haben Sie Ihren Statuscode nicht überprüft.

So etwas wie dies funktioniert, wenn der Inhalt Text ist:

public string DownloadString(string uri, out int status) 
{ 
    string result= null; 
    status = 0; 
    HttpWebResponse response= null; 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(uri); 
     // augment the request here: headers (Referer, User-Agent, etc) 
     //  CookieContainer, Accept, etc. 
     response= (HttpWebResponse) request.GetResponse(); 
     Encoding responseEncoding = Encoding.GetEncoding(response.CharacterSet); 
     using (StreamReader sr = new StreamReader(response.GetResponseStream(), responseEncoding)) 
     { 
      result = sr.ReadToEnd(); 
     } 
     status = (int) response.StatusCode; 
    } 
    catch (WebException wexc1) 
    { 
     // any statusCode other than 200 gets caught here 
     if(wexc1.Status == WebExceptionStatus.ProtocolError) 
     { 
      // can also get the decription: 
      // ((HttpWebResponse)wexc1.Response).StatusDescription; 
      status = (int) ((HttpWebResponse)wexc1.Response).StatusCode; 
     } 
    } 
    finally 
    { 
     if (response!= null) 
      response.Close(); 
    } 
    return result; 
} 
+0

Die Frage ist über den Anfrage-Stream, nicht die Antwort. – MatteoSp

-5

Versuchen Sie es mit Fiddler. Arbeitete für mich.

Fiedler:

  • ist ein Web Debugging Proxy
  • protokolliert alle HTTP (S) den Datenverkehr zwischen Ihrem Computer und dem Internet
  • Sie alle HTTP (S) -Verkehr inspizieren können, Breakpoints setzen, und „Geige“ mit Daten
  • Freeware ist
  • kann der Verkehr debuggen von allen fast alle Anwendungen (Web-Browser und mehr)
+1

das hat damit nichts zu tun. Dies ist eine Anfrage in einer ASP-Seite (oder nur C#) an eine externe URL mit der Absicht, die Daten in der ursprünglichen Anfrage in Ihrer Anwendung zu verwenden. Auch wenn das nicht der Fall sein sollte, werde ich doch auf meinen Produktionsserver nur einen Proxy setzen. – FlavorScape