对于从Web API 2控制器返回,如果响应是OK(状态200),我可以返回内容与响应:

public IHttpActionResult Get()
{
    string myResult = ...
    return Ok(myResult);
}

如果可能的话,我希望在这里尽可能使用内置结果类型

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

public IHttpActionResult Get()
{
    return InternalServerError();
}

但这不是:

public IHttpActionResult Get()
{
    return InternalServerError("Message describing the error here");
}

理想情况下,我希望这是一般化的,这样我就可以用IHttpActionResult的任何实现发送回消息。

我需要这样做(并建立我的响应消息):

public IHttpActionResult Get()
{
    HttpResponseMessage responseMessage = ...;
    return ResponseMessage(responseMessage);
}

还是有更好的办法?


当前回答

你还可以:

return InternalServerError(new Exception("SOME CUSTOM MESSAGE"));

其他回答

在ASP。你可以在一个ResponseMessageResult中包装任何ResponseMessage:

public IHttpActionResult Get()
{
   HttpResponseMessage responseMessage = ...
   return new ResponseMessageResult(responseMessage);
}

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

一个更详细的示例,支持在c# HttpStatusCode中未定义的HTTP代码。

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpStatusCode codeNotDefined = (HttpStatusCode)429;
        return Content(codeNotDefined, "message to be sent in response body");
    }
}

Content是在抽象类ApiController(控制器的基类)中定义的虚方法。声明如下:

protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);

简单:

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

记住引用System.Net.Http和System.Net。

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

return Ok() 

or

return NotFound()

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

我最终采用了以下解决方案:

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

... 可以这样使用:

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

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