HttpWebRequest WebException ProtocolError

9
我正在尝试理解关于使用 HttpWebRequest 进行异常处理的内容。
我有一个客户端库,它正在向 WebAPI 控制器发出请求;
HttpWebRequest r = (HttpWebRequest)WebRequest.Create(url);

r.Method = "POST";
r.ContentType = "application/json";

foreach (var header in request.Headers)
{
     r.Headers.Add(header.Key, header.Value.ToString());
}

r.ContentLength = request.RequestBody.Length;

using (StreamWriter writer = new StreamWriter(r.GetRequestStream()))
    writer.Write(request.RequestBody);

我知道该请求会抛出一个异常,并包含消息实体已存在 - 1234
当我收到响应时;
using (HttpWebResponse response = (HttpWebResponse)r.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK)
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            return reader.ReadToEnd();

     return "Invalid"; 
 }

我遇到了一个WebException的问题,请求的调用方有一个try..catch。然后我得到了这个WebException。我得到的是协议错误,而不是抛出的500内部服务器错误(使用正确的状态代码来表示消息稍后会出现)。现在如果我读取WebExceptionResponse,它确实包含我的消息和堆栈跟踪。

问题

  • 为什么响应中没有500状态代码,而是抛出了协议错误?
  • 有没有更正确的处理请求的方法?

我搜索了一下发现有些人在使用不正确的头文件等时会遇到这个问题。但据我所知,我已经添加了所有可添加的头文件,但仍旧出现相同的问题。


500是HTTP协议中指定的错误代码;异常意味着“我正在使用的协议发生了错误”。500本身将在webexception响应状态码属性中。 - Alex K.
那么,通过提取WebException响应来处理这个问题是正确的方式吗?还是我返回异常的方式有误?我不习惯像这样处理异常,通常我能够处理状态码并从那里继续。 - tbddeveloper
1个回答

1
通常情况下,500内部服务器错误意味着API已经接收到请求,但在处理该请求时抛出了未处理的异常,因此会出现“内部服务器错误”。您可以将所有API未处理的异常记录到数据库或文件中以帮助调试过程。祝好运。

1
为什么要踩这个回答?在过去的5年里,这是唯一一个楼主得到的回答。 - dialex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接