14

I'm communicating with a web server from .Net. The web server throws a 500 internal server error and writes a detailed error message.

I'm trying to read the error message that is received from a web exception, but getting another web exception. Why is the second WebException thrown?

try
{
  var webResponse = (HttpWebResponse)webRequest.GetResponse();
}
catch (WebException e)
{
  if (e.Status == WebExceptionStatus.ProtocolError)
  {
    // the next line throws a web exception
    Console.WriteLine(new StreamReader(e.Response.GetResponseStream()).ReadToEnd());
  }
}
pnuts
  • 58,317
  • 11
  • 87
  • 139
ripper234
  • 222,824
  • 274
  • 634
  • 905

1 Answers1

13

Why is this surprising? Try the following from MSDN:

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     using (HttpWebResponse myHttpWebResponse = 
               (HttpWebResponse) myHttpWebRequest.GetResponse()) {
        myHttpWebResponse.Close();
    }
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        var response = ((HttpWebResponse)e.Response);
        Console.WriteLine("Status Code : {0}", response.StatusCode);
        Console.WriteLine("Status Description : {0}", response.StatusDescription);

        try {
            using (var stream = response.GetResponseStream()) {
            using (var reader = new StreamReader(stream)) {
                var text = reader.ReadToEnd();
                Console.WriteLine(text);
            }
            }
        } catch (WebException ex) {
            // Oh, well, we tried
        }
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}
John Saunders
  • 160,644
  • 26
  • 247
  • 397
  • Amm, because I want to actually read the error message transmitted over the wire somehow. The website is not non-existent, it replies with an error, which I want to log / analyze on the client side. – ripper234 Jul 22 '09 at 20:27
  • If the web site is nonexistant, where's the error come from? At any rate, updated. – John Saunders Jul 22 '09 at 20:30
  • And the update still doesn't help much - I don't understand why I'm getting an exception in the catch block. – ripper234 Jul 22 '09 at 20:38
  • 1
    Interesting. I missed the "non". Please post the FULL exception you get in the catch block. Post the results of ex.ToString(). Also, if you implemented the code above, what's the value of ((HttpWebResponse)e.Response).StatusCode and .StatusDescription? – John Saunders Jul 22 '09 at 20:42