如何从WebAPI的HttpResponse对象中获取错误消息?

22

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

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以获取消息内容“无权限”。状态代码返回正常。只是难以获取消息内容


我似乎现在有一种解决方案,就是使用response.Content.ReadAsAsync<HttpError>().Result来获取消息。但不确定是否有更好的方法。 - TDD Junkie
4个回答

20

根据您在评论中的推测,您可以使用 response.Content.ReadAsAsync<HttpError>() 或者 response.TryGetContentValue<HttpError>()。在这两种情况下,都会检查内容是否为 ObjectContent 类型,并从中检索值。


啊,是的,我还没有尝试过 TryGetContentValue。我也会尝试一下。谢谢 :) - TDD Junkie
4
当我看到你提到TryGetContentValue时,我感到困惑,因为我以前从未见过它,并且它不是异步的。现在我意识到它只对处理尚未通过网络传输的服务器响应非常有用。我想知道有多少人会在客户端尝试使用它,然后惊讶地发现它永远不会返回有效结果。 - Darrel Miller
是的...没错...它只在服务器端有用... TryGetContentValue 存在于 System.Web.Http 的 dll 中,所以在大多数情况下客户端不应该看到它。 - Kiran

6
尝试这个:response.Content.ReadAsAsync<HttpError>().Result.Message;

有点“死灵帖”的感觉,但这个回答以最简洁的形式给出了我需要的答案,谢谢! - William T. Mallard
1
使用async/await等待会更好,原因有两个:
  1. 这样可以在等待期间打开资源以处理其他请求。
  2. .Result存在死锁问题,而且很难向初级或中级开发人员解释何时可以使用.Result,何时不应使用。因此,通常最好避免使用。
因此,Nikoloz的答案更好:var errorContent = await response.Content.ReadAsAsync<HttpError>();
- k29

3
您可以尝试以下方法:
var errorContent = await response.Content.ReadAsAsync<HttpError>();
Assert.That(errorContent.Message,Is.EqualTo("No Permission"));

2

这样读错误信息。

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

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