2013-06-13 47 views
4

我有从以下消息下面的代码生成异常的控制器: -如何从WebAPI中的HttpResponse对象获取错误消息?

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

+0

我似乎有某种解决这个现在是使用response.Content.ReadAsAsync ()。结果给我的消息。不知道是否有更好的方法。 –

回答

6

正如您在评论中提到的那样,您可以使用response.Content.ReadAsAsync<HttpError>()或者也可以使用response.TryGetContentValue<HttpError>()。 在这两种情况下,将检查内容以查看是否其类型为ObjectContent,并从中检索值。

+0

啊,是的,我没有尝试TryGetContentValue。也会放弃这一点。谢谢:) –

+4

当我看到你提到TryGetContentValue时,我很困惑,因为我以前从未见过它,它不是异步的。现在我意识到,只有在服务器通过网络传输之前处理服务器上的响应才是真正有用的。我想知道有多少人会尝试在客户端上使用它,并想知道为什么它永远不会返回有效的结果。 –

+0

是的......正确的......它只在服务器上有用......'TryGetContentValue'存在于'System.Web.Http'.dll中,所以在大多数情况下客户端不应该看到它。 –

3

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

+0

有点坏,但这给了我需要的最简洁的答案,谢谢! –

1

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