views:

680

answers:

4

hi i want to read request stream from a custom httpWebRequest class that inherits from httpWebRequest and i have tried to read the request stream in different stages but sitll not sure how to archieve that in the class,thanks very much for any help.

This custom httpWebRequest is used to serilize soap message and i want to know what request has been sent in string format. I also implemented custom HttpRequestCreator,HttpWebResponse but till cant find a place/stage i can read the request stream. If i output everything in a memory stream then copy the content to request stream, anyone knows which stage i can do it in the constructor, BeginGetRequestStream,EndGetRequestStream or GetRequestStream?

A: 

Take a look at this article from code project it should help.

rerun
+1  A: 

Your question is unclear.

If you're trying to read an HttpWebRequest's request stream after other code has written to the stream (a POST request), it's not possible. (The stream is sent directly to the server and is not stored in memory)

Instead, you'll need to expose your own MemoryStream, then write it to the HttpWebRequest's request stream wen you're ready to send the request.

SLaks
thanks very much for the response, could u let me know which stage/method i can expose my memorystream ? thanks again
sam
A: 

The "stream is not readable" will result if there is an error return code, like 404, 503, 401, and so on. It's likely you haven't checked your status code.

Something like this works if the content is text:

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;
}
Cheeso
+1  A: 

Try using Fiddler. Worked for me.

Fiddler:

  • is a Web Debugging Proxy
  • logs all HTTP(S) traffic between your computer and the Internet
  • allows you to inspect all HTTP(S) traffic, set breakpoints, and "fiddle" with data
  • is freeware
  • can debug traffic from all almost all apps (web browsers and more)
Bill Paetzke