【问题标题】:How do I read a custom error message returned when HttpWebRequest.GetResponse throws a WebException?如何读取 HttpWebRequest.GetResponse 引发 WebException 时返回的自定义错误消息?
【发布时间】:2019-10-16 05:52:27
【问题描述】:

我有一个带有简单测试方法的 NET.Core API:

public async Task<IActionResult> TestApi()
{
    try
    {
        throw new UnauthorizedAccessException("My custom error");

        return Ok();
    }
    catch (UnauthorizedAccessException ex)
    {
        return StatusCode(401,ex.Message);
    }
    catch (Exception ex)
    {
        throw;
    }

}

我需要像这样从客户端检索消息:

var request = WebRequest.Create($"{baseUrl}{url}") as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json";
request.Expect = "application/json";
request.ContentLength = 0;

if (parameters != null)
{
    request.ContentLength = serializedObject.Length;
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(serializedObject);
    }
}

var response = request.GetResponse() as HttpWebResponse;
var responseEncoding = Encoding.GetEncoding(response.CharacterSet);

using (var sr = new StreamReader(response.GetResponseStream(), responseEncoding))
{
    var result = sr.ReadToEnd();
    return JsonConvert.DeserializeObject<T>(result);
}

现在request.GetResponse() as HttpWebResponse 回复我:

The remote server returned an error: (401) Unauthorized.

而不是My custom error。有人能指出我正确的方向吗?

【问题讨论】:

  • 你看过内部异常了吗?
  • InnerException 是 nullResponse 对象中没有其他信息。
  • 查看Response 属性。特别是Response.StatusDescription。您看到的消息未从您的 API 返回。您的 API 返回 401 并且GetResponse 使用此默认消息引发异常。该异常有一个 Response 属性,其中包含有关响应的更多详细信息,包括该消息。
  • 你看过这篇文章吗:stackoverflow.com/questions/46689006/… ?
  • 我读了很多帖子都没有运气。你建议的是 MVC 5。

标签: c# .net-core


【解决方案1】:

返回一个 ActionResult

Task<ActionResult>

然后您可以将未经授权的错误封装在 UnauthorizedObjectResult 中

return Unauthorized(new UnauthorizedObjectResult(errorModel));

【讨论】:

    【解决方案2】:

    这是一个简化的示例,它读取您的自定义消息。您的消息会在响应流中返回。

    try
    {
        var response = request.GetResponse() as HttpWebResponse;
    }
    catch (WebException ex) // this exception is thrown because of the 401.
    {
        var responseStream = ex.Response.GetResponseStream();
        using (var reader = new StreamReader(responseStream))
        {
            var message = reader.ReadToEnd();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多