当然,肯定有一种方法可以配置.Net HttpWebRequest对象,以便在调用HttpWebRequest.GetResponse()并返回任何300或400状态代码时不会引发异常?
也许有一些模糊的配置设置逃避了Jon Skeet?也许有一种完全不同类型的请求对象可以使用但没有这种行为?
(是的,我知道你可以抓住异常并从中得到答案,但我想找到一种不必要的方法)。
感谢您的帮助
答案 0 :(得分:12)
如果您想从4xx错误中检索错误响应,可以这样做:
HttpWebResponse res = null;
string response = string.Empty;
StreamReader sr = null;
Stream resst = null;
try
{
res = (HttpWebResponse)req.GetResponse();
resst = res.GetResponseStream();
sr = new StreamReader(resst);
response = sr.ReadToEnd();
}
catch (WebException exception)
{
HttpWebResponse errorResponse = (HttpWebResponse)exception.Response;
resst = errorResponse.GetResponseStream();
sr = new StreamReader(resst);
response = sr.ReadToEnd();
}
this.Response.Write(response);
希望这会有所帮助......
答案 1 :(得分:5)
根据规范,当服务器发送400状态代码时,意味着:
请求无法理解 由于语法错误导致的服务器。 客户端不应该重复 请求不加修改。
所以在这种情况下看起来很自然。就300而言,它更值得商榷。
无论如何,如果你想要一些非标准的行为,你总是可以诉诸TcpClient,但这似乎是一种极端和绝望的措施。
您是否进行过性能测试?您是否确认在此例外案例中抛出异常是您的应用程序的瓶颈?在这种情况下,这似乎是微优化。难道你不能通过伪造一个有效的请求并最终得到200来使这个Web服务器满意吗?如果没有,你不能切换到更标准的Web服务器?
答案 2 :(得分:5)
最佳答案:
修复WebRequest希望抛出异常而不是返回状态
答案 3 :(得分:1)
将HttpWebRequest上的AllowAutoRedirect属性设置为false将停止在服务器发送300状态代码时抛出异常。
但它不会阻止404状态代码抛出异常。