using System;
using System.IO;
using System.Web;
using System.Net;
public class Test
{
static void Main()
{
WebRequest request = WebRequest.Create("http://csharpindepth.com/asd");
try
{
using (WebResponse response = request.GetResponse())
{
Console.WriteLine("Won't get here");
}
}
catch (WebException e)
{
using (WebResponse response = e.Response)
{
HttpWebResponse httpResponse = (HttpWebResponse) response;
Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
using (Stream data = response.GetResponseStream())
using (var reader = new StreamReader(data))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
}
}
}
}
6 回答
如果有某种方法可以关闭“抛出非成功代码”,那将会很好,但是如果你捕获WebException,你至少可以使用响应:
你可能想在一个单独的方法中封装“让我得到一个响应,即使它不是成功代码” . (如果没有回复,我建议你仍然扔,例如,如果你无法连接 . )
如果错误响应可能很大(这是不寻常的),您可能需要调整HttpWebRequest.DefaultMaximumErrorResponseLength以确保您收到整个错误 .
我知道很久以前就已经回答了这个问题,但我做了一个扩展方法,希望能帮助其他人来解决这个问题 .
Code:
Usage:
尝试连接到Google的OAuth2服务时,我遇到了类似的问题 .
我最终手动编写POST,而不是使用WebRequest,如下所示:
写入响应流的响应包含您所追踪的特定错误文本 .
特别是,我的问题是我在URL编码的数据片段之间放置了 endpoints . 当我拿出它们时,一切正常 . 您可以使用类似的技术连接到您的服务并阅读实际的响应错误文本 .
有趣的是,从
WebException.Response
获得的HttpWebResponse.GetResponseStream()
与您从服务器收到的响应流不同 . 在我们的环境中,当使用HttpWebRequest/HttpWebResponse
对象将 400 HTTP status 代码返回给客户端时,我们将丢失实际的服务器响应 . 根据我们所看到的,与WebException's HttpWebResponse
关联的响应流在客户端生成,不包括服务器的任何响应主体 . 非常令人沮丧,因为我们想要向客户端发回错误请求的原因 .试试这个(这是VB代码:-):
扩展函数的异步版本: