2013-06-13 46 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"));