对于从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);
}

还是有更好的办法?


当前回答

我也有同样的问题。我想为我的api控制器创建自定义结果,像这样调用它们 return Ok("some text");

然后我这样做了: 1)使用singletone创建自定义结果类型

public sealed class EmptyResult : IHttpActionResult
{
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.NoContent) { Content = new StringContent("Empty result") });
    }
}

2)使用new方法创建自定义控制器:

public class CustomApiController : ApiController
{
    public IHttpActionResult EmptyResult()
    {
        return new EmptyResult();
    }
}

然后我可以在我的控制器中调用它们,像这样:

public IHttpActionResult SomeMethod()
    {
       return EmptyResult();
    }

其他回答

简单:

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

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

你可以使用HttpRequestMessagesExtensions。CreateErrorResponse (System.Net。Http命名空间),就像这样:

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

最好基于请求创建响应,以利用Web API的内容协商。

我建议你阅读这篇文章。有很多方法可以使用现有的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
}

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

一个更详细的示例,支持在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);