【问题标题】:return type in webAPI callwebAPI 调用中的返回类型
【发布时间】:2016-12-28 13:17:51
【问题描述】:


ASP.NET WebAPI方法调用中使用IHttpActionResult作为返回类型有什么意义
由于这是一个接口,我们如何以接口的形式返回结果?
有人能解释一下这背后的概念吗?

提前致谢!!

【问题讨论】:

  • 这里有一个很好的解释; stackoverflow.com/questions/21758615/… 寻找 Behzad Bahmanyar 的帖子
  • 这只是对先前使用HttpResponseMessage 标准的更新,尽管也没有什么能阻止您仍然只是返回一个对象本身。 HttpResponseMessage 和 IHttpActionResult 之类的类型只是让您对响应的 HTTP 包装器进行更多控制,而不是仅仅返回数据而不是抛出异常。我想我不太清楚你在问什么。
  • 你的问题基本上是Why are interfaces useful?。
  • 此链接解释了 Web API 控制器的一些不同返回类型。 alastaircrabtree.com/…

标签: asp.net asp.net-web-api asp.net-web-api2


【解决方案1】:

基于Microsoft ASP.NET 文档,

IHttpActionResult 接口是在 Web API 2 中引入的。本质上,它定义了一个 HttpResponseMessage 工厂。以下是使用 IHttpActionResult 接口的一些优点:

  • 简化对控制器的单元测试。
  • 将用于创建 HTTP 响应的通用逻辑移到单独的类中。
  • 通过隐藏 构建响应的底层细节。

IHttpActionResult 包含一个方法 ExecuteAsync,它异步创建一个 HttpResponseMessage 实例。

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

如果控制器操作返回 IHttpActionResult,Web API 会调用 ExecuteAsync 方法来创建 HttpResponseMessage。然后它将 HttpResponseMessage 转换为 HTTP 响应消息。

这是一个创建纯文本响应的 IHttpActionResult 的简单实现:

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);
    }
}

控制器中的另一个示例:

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

还有它的Respond:

HTTP/1.1 200 OK Content-Length: 5 Content-Type: text/plain; charset=utf-8 服务器:Microsoft-IIS/8.0 日期:2014 年 1 月 27 日,星期一 格林威治标准时间 08:53:35

你好

我希望这会有所帮助。祝你好运。

【讨论】:

  • 感谢您的解释。这很有帮助。我还有一个疑问。返回类型如何是接口。我的意思是我可以理解返回一个字符串,任何类的对象,但是一个如何返回接口?
  • @AmeyDeshpande 你根据这个接口的规则返回一个类型,一个接口包含规则并且基于这些规则你可以返回一个类型。用简单的英语:)
  • 对不起:(你能详细说明一下吗?没有得到你想说的。
猜你喜欢
  • 2015-06-15
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2013-07-02
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多