使用IHttpActionResult返回内容以获得非OK响应

may*_*lle 177 c# httpresponse asp.net-web-api

对于从Web API 2控制器返回,如果响应正常(状态200),我可以返回带有响应的内容,如下所示:

    public IHttpActionResult Get()
    {
        string myResult = ...
        return Ok(myResult);
    }
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想在可能的情况下使用内置的结果类型:https://msdn.microsoft.com/en-us/library/system.web.http.results(v = vs.118).aspx

我的问题是,对于另一种类型的响应(不是200),如何用它返回消息(字符串)?例如,我可以这样做:

    public IHttpActionResult Get()
    {
       return InternalServerError();
    }
Run Code Online (Sandbox Code Playgroud)

但不是这个:

    public IHttpActionResult Get()
    {
       return InternalServerError("Message describing the error here");
    }
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将其推广,以便我可以使用IHttpActionResult的任何实现发回消息.

我是否需要这样做(并构建我自己的响应消息):

    public IHttpActionResult Get()
    {
       HttpResponseMessage responseMessage = ...
       return ResponseMessage(responseMessage);
    }
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

Sha*_*pov 402

你可以用这个:

return Content(HttpStatusCode.BadRequest, "Any object");
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试这个时,`return`(其中代码是一个字符串)在`return Content(HttpStatusCode.OK,code)`中返回的值被封装在"这是意料之中,有什么理由吗?例如,值返回的是""\"value \""`我正在使用mvc5 (6认同)
  • 如果您需要从ApiController类外部执行此操作,则可以使用:return new NegotiatedContentResult <T>(code,new T(...),controller) (2认同)

use*_*220 53

您可以使用HttpRequestMessagesExtensions.CreateErrorResponse(System.Net.Http名称空间),如下所示:

public IHttpActionResult Get()
{
   return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Message describing the error here"));
}
Run Code Online (Sandbox Code Playgroud)

最好根据请求创建响应以利用Web API的内容协商.

  • Request.CreateErrorResponse返回HttpResponseMessage,而不是IHttpActionResult.你所描述的是创建HttpResponseMessage的好习惯,但没有解决我的问题.不管怎么说,还是要谢谢你! (6认同)

may*_*lle 33

我最终得到了以下解决方案:

public class HttpActionResult : IHttpActionResult
{
    private readonly string _message;
    private readonly HttpStatusCode _statusCode;

    public HttpActionResult(HttpStatusCode statusCode, string message)
    {
        _statusCode = statusCode;
        _message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage(_statusCode)
        {
            Content = new StringContent(_message)
        };
        return Task.FromResult(response);
    }
}
Run Code Online (Sandbox Code Playgroud)

......可以像这样使用:

public IHttpActionResult Get()
{
   return new HttpActionResult(HttpStatusCode.InternalServerError, "error message"); // can use any HTTP status code
}
Run Code Online (Sandbox Code Playgroud)

我愿意接受改进建议.:)

  • Shaamil Yakupov 的答案是最好的答案,但仅限于 ApiController 类内部 - 它需要重写为“return new NegotiatedContentResult&lt;T&gt;(code, new T(...),controller)”,以便从外部使用控制器类。在这种情况下,像上面这样的解决方案可能更具可读性。 (2认同)

ila*_*ans 15

你也可以这样做:

return InternalServerError(new Exception("SOME CUSTOM MESSAGE"));
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是取回消息文本很痛苦 (2认同)

Cul*_*tes 7

任何有兴趣通过返回ResponseMessage返回任何状态代码的人:

//CreateResponse(HttpStatusCode, T value)
return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object));
Run Code Online (Sandbox Code Playgroud)


sfu*_*qua 7

在ASP.NET Web API 2中,您可以将任何内容包装ResponseMessageResponseMessageResult中:

public IHttpActionResult Get()
{
   HttpResponseMessage responseMessage = ...
   return new ResponseMessageResult(responseMessage);
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,这可能是获得所需结果的最简单方法,尽管通常最好在System.Web.Http.Results中使用各种结果.


小智 6

我建议阅读这篇文章。有很多方法可以按照建议使用现有的 HttpResponse,但如果您想利用 Web Api 2,那么请考虑使用一些内置的 IHttpActionResult 选项,例如

return Ok() 
Run Code Online (Sandbox Code Playgroud)

或者

return NotFound()
Run Code Online (Sandbox Code Playgroud)

为 Web Api 控制器选择正确的返回类型


Rod*_*eis 5

简单:

return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Your message"));

记住要引用System.Net.HttpSystem.Net