2016-12-28 94 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

对不起:(你能详细说明吗?没有得到你想说的。 –