【问题标题】:How do I get the error message from an HttpResponse object in WebAPI?如何从 WebAPI 中的 HttpResponse 对象获取错误消息?
【发布时间】:2021-01-05 18:16:46
【问题描述】:

我有一个控制器,它从以下代码生成异常并带有以下消息:-

public HttpResponseMessage PutABook(Book bookToSave)
{
   return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "No Permission");
}

我正在使用以下代码测试此方法:-

var response = controller.PutABook(new Book());
Assert.That(response.StatusCode,Is.EqualTo(HttpStatusCode.Forbidden));
Assert.That(response.Content,Is.EqualTo("No Permission"));

但我收到内容不是“无权限”的错误。似乎我也无法将响应投射到HttpError 以获取消息内容“无权限”。状态码返回正常。只是努力获得message content

【问题讨论】:

  • 我现在似乎有某种解决方案,即使用 response.Content.ReadAsAsync().Result 给我消息。不确定是否有更好的方法。

标签: c# asp.net-web-api


【解决方案1】:

正如您在评论中所说,您可以使用response.Content.ReadAsAsync<HttpError>(),也可以使用response.TryGetContentValue<HttpError>()。 在这两种情况下,都会检查内容以查看其类型是否为 ObjectContent 并从中检索值。

【讨论】:

  • 啊,是的,我没有尝试过 TryGetContentValue。也会试一试。谢谢:)
  • 当我看到你提到 TryGetContentValue 我很困惑,因为我以前从未见过它,而且它不是异步的。现在我意识到它只对在通过网络传输之前处理服务器上的响应非常有用。我想知道有多少人会尝试在客户端上使用它,并想知道为什么它永远不会返回有效结果。
  • 是的...对...它仅在服务器上有用...TryGetContentValue 存在于System.Web.Http dll 中,因此在大多数情况下客户端不应该看到它.
【解决方案2】:

试试这个。 response.Content.ReadAsAsync<HttpError>().Result.Message;

【讨论】:

  • 有点死神,但这以最简洁的形式给出了我需要的答案,谢谢!
  • 在 async 上等待会更好,原因有两个: 1. 它打开资源用于处理其他请求,同时发生这种情况。 2. .Result 因死锁问题而臭名昭著,向初级或中级开发人员解释何时可以使用 .Result 和不可以使用非常复杂,因此不惜一切代价避免一般的最佳实践。因此 Nikoloz 的答案更好: var errorContent = await response.Content.ReadAsAsync();
【解决方案3】:

您可以尝试以下方法:

var errorContent = await response.Content.ReadAsAsync<HttpError>();
Assert.That(errorContent.Message,Is.EqualTo("No Permission"));

【讨论】:

    【解决方案4】:

    以这种方式阅读错误信息。

    var ErrMsg = JsonConvert.DeserializeObject<dynamic>(response.Content.ReadAsStringAsync().Result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-25
      • 2021-12-24
      • 1970-01-01
      • 2022-07-22
      • 2019-10-28
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多