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

还是有更好的办法?


当前回答

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

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

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

其他回答

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

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

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

我也有同样的问题。我想为我的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();
    }

对于例外情况,我通常会这样做

 catch (Exception ex)
        {
            return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.Message));
        }

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

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

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

这个答案是基于Shamil Yakupov的答案,用真实的对象而不是字符串。

using System.Dynamic;

dynamic response = new ExpandoObject();
response.message = "Email address already exist";

return Content<object>(HttpStatusCode.BadRequest, response);