我一直在用WebApi开发,已经转移到WebApi2,微软已经引入了一个新的IHttpActionResult接口,似乎建议用于返回一个HttpResponseMessage。我对这个新界面的优点感到困惑。它似乎只是提供了一种稍微简单的方法来创建HttpResponseMessage。

我认为这是“为了抽象而抽象”。我遗漏了什么吗?除了节省一行代码之外,我从使用这个新接口中获得的实际优势是什么?

旧方法(WebApi):

public HttpResponseMessage Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
    else
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

新方法(WebApi2):

public IHttpActionResult Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        //return new HttpResponseMessage(HttpStatusCode.OK);
        return Ok();
    }
    else
    {
        //throw new HttpResponseException(HttpStatusCode.NotFound);
        return NotFound();
    }
}

当前回答

// this will return HttpResponseMessage as IHttpActionResult
return ResponseMessage(httpResponseMessage); 

其他回答

我宁愿为IHttpActionResult实现TaskExecuteAsync接口函数。喜欢的东西:

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);

        switch ((Int32)_respContent.Code)
        { 
            case 1:
            case 6:
            case 7:
                response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);
                break;
            case 2:
            case 3:
            case 4:
                response = _request.CreateResponse(HttpStatusCode.BadRequest, _respContent);
                break;
        } 

        return Task.FromResult(response);
    }

,其中_request是HttpRequest, _respContent是有效负载。

// this will return HttpResponseMessage as IHttpActionResult
return ResponseMessage(httpResponseMessage); 

使用IHttpActionResult而不是HttpResponseMessage有以下好处:

通过使用IHttpActionResult,我们只关注要发送的数据,而不是状态码。所以这里的代码会更简洁,也更容易维护。 实现的控制器方法的单元测试将更容易。 默认使用async和await。

Web API基本上返回4种类型的对象:void、HttpResponseMessage、IHttpActionResult和其他强类型。Web API的第一个版本返回HttpResponseMessage,这是一个非常直接的HTTP响应消息。

IHttpActionResult是由WebAPI 2引入的,它是HttpResponseMessage的一种包装。它包含ExecuteAsync()方法来创建HttpResponseMessage。它简化了控制器的单元测试。

其他返回类型是一种强类型类,由Web API使用媒体格式化器序列化到响应体中。缺点是不能直接返回404之类的错误代码。你所能做的就是抛出一个HttpResponseException错误。

您可能决定不使用IHttpActionResult,因为您现有的代码构建了一个HttpResponseMessage,该HttpResponseMessage不适合其中一个封闭响应。但是,您可以使用ResponseMessage的罐装响应将HttpResponseMessage改编为IHttpActionResult。我花了一段时间来弄清楚这个问题,所以我想把它贴出来,让你不必非得选择其中之一:

public IHttpActionResult SomeAction()
{
   IHttpActionResult response;
   //we want a 303 with the ability to set location
   HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.RedirectMethod);
   responseMsg.Headers.Location = new Uri("http://customLocation.blah");
   response = ResponseMessage(responseMsg);
   return response;
}

注意,ResponseMessage是你的控制器应该继承的基类ApiController的一个方法。