2016-12-28 41 views
1


在ASP.NET WebAPI方法調用中,使用IHttpActionResult作爲返回類型有什麼意義。
由於這是一個接口,我們如何以界面的形式返回結果?
有人可以解釋這背後的概念嗎?

在此先感謝!webAPI調用中的返回類型

+0

這裏有一個很好的expilanation; http://stackoverflow.com/questions/21758615/why-should-i-use-ihttpactionresult-instead-of-httpresponsemessage 查找Behzad Bahmanyar的職位 – Mehmet

+1

這只是一個更新到以前的標準使用'HttpResponseMessage'儘管也沒有任何東西阻止你繼續返回一個對象本身。像「HttpResponseMessage」和「IHttpActionResult」這樣的類型只是簡單地給了你對HTTP響應包裝器的更多控制權,而不僅僅是返回數據和拋出異常。我想這對我而言並不是很清楚,具體是你在問什麼。 – David

+0

***你的問題基本上是[爲什麼接口有用?](http://softwareengineering.stackexchange.com/questions/108240/why-are-interfaces-useful)。*** – Win

回答

1

基於該Microsoft ASP.NET文檔,

IHttpActionResult接口在網絡API 2.引種本質上,它定義了一個HttpResponseMessage工廠。下面是使用IHttpActionResult接口的一些優點:

  • 簡化單元測試您的控制器。
  • 將用於創建HTTP響應的通用邏輯移動到單獨的類中。
  • 通過隱藏 構建響應的底層細節,使控制器操作的意圖更加清晰。

IHttpActionResult包含一個方法ExecuteAsync,它異步地創建一個HttpResponseMessage實例。

public interface IHttpActionResult 
{ 
    Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); 
} 

如果一個控制器動作返回IHttpActionResult,網頁API調用ExecuteAsync方法來創建一個HttpResponseMessage。然後它將HttpResponseMessage轉換爲HTTP響應消息。

這裏是IHttpActionResult的簡單implementaton創建一個純文本響應:

public class ValuesController : ApiController 
{ 
    public IHttpActionResult Get() 
    { 
     return new TextResult("hello", Request); 
    } 
} 

及其Respond

HTTP/1.1

public class TextResult : IHttpActionResult 
{ 
    string _value; 
    HttpRequestMessage _request; 

    public TextResult(string value, HttpRequestMessage request) 
    { 
     _value = value; 
     _request = request; 
    } 
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     var response = new HttpResponseMessage() 
     { 
      Content = new StringContent(_value), 
      RequestMessage = _request 
     }; 
     return Task.FromResult(response); 
    } 
} 

在控制器中的另一個示例200 OK Content-Length:5 Content-Type:text/plain; 的charset = UTF-8服務器:Microsoft-IIS/8.0日期:星期一,2014年1月27日 8時53分35秒GMT

你好

我希望這有助於。祝你好運。

+0

感謝您的解釋。這很有幫助。我還有一個疑問。如何返回類型是接口。我的意思是我可以理解返回任何類的字符串,對象,但如何返回接口? –

+0

@AmeyDeshpande你根據這個接口的規則返回一個類型,一個接口包含規則並且基於這些規則你可以返回一個類型。簡單的英語:) – Valkyrie

+0

對不起:(你能詳細說明嗎?沒有得到你想說的。 –