使用IHttpActionResult返回非正常响应的内容

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

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

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

我的问题是,对于另一种types的响应(而不是200),我怎样才能返回一个消息(string)呢? 例如,我可以这样做:

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

但不是这样的:

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

理想情况下,我希望这是泛化,以便我可以发送一个消息与IHttpActionResult的任何实现。

我是否需要这样做(并build立自己的回应讯息):

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

或者,还有更好的方法?

你可以使用这个:

 return Content(HttpStatusCode.BadRequest, "Any object"); 

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

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

最好根据请求创build响应,以利用Web API的内容协商。

我结束了以下解决scheme:

 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 } 

我愿意接受改进build议。 🙂

你也可以这样做:

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

任何有兴趣返回带有返回ResponseMessage的任何状态码的任何人:

 //CreateResponse(HttpStatusCode, T value) return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object)); 

在ASP.NET Web API 2中,可以将任何ResponseMessage包装在ResponseMessageResult中 :

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

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

这里有这么多的答案,但我还没有find任何答案的状态说明中直接返回exception消息。

例如,如果我正在编写WCF服务,则可以按照本教程的说明直接返回exception消息作为响应状态的一部分:

错误

这里的大多数答案也会返回一个500状态,但是这个错误信息会作为一个JSON对象返回,或者是一个单独的响应string,而不是响应状态的一部分。

例如,如果我使用这个代码:

 catch (Exception ex) { return new System.Web.Http.Results.ResponseMessageResult( Request.CreateErrorResponse((HttpStatusCode)500, new HttpError("Something went wrong"))); } 

…然后它返回一个通用的500消息,并以JSONstring返回exception。

在这里输入图像说明

我发现直接将exception消息文本作为StatusDescription一部分是很StatusDescription 。 有没有办法做到这一点,在一个Web API 2控制器返回一个IHttpActionResult

@mayabelle你可以创buildIHttpActionResult混凝土,并包装这些代码:

 public class NotFoundPlainTextActionResult : IHttpActionResult { public NotFoundPlainTextActionResult(HttpRequestMessage request, string message) { Request = request; Message = message; } public string Message { get; private set; } public HttpRequestMessage Request { get; private set; } public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(ExecuteResult()); } public HttpResponseMessage ExecuteResult() { var response = new HttpResponseMessage(); if (!string.IsNullOrWhiteSpace(Message)) //response.Content = new StringContent(Message); response = Request.CreateErrorResponse(HttpStatusCode.NotFound, new Exception(Message)); response.RequestMessage = Request; return response; } } 

对不起,为什么不简单的使用

return BadRequest("your message");

我用它来处理所有的IHttpActionResult错误

这里是文档: https : //msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx

我有同样的问题。 我想为我的api控制器创build自定义的结果,把它们称为return Ok("some text");

然后我这样做:1)创build自定义的结果types与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)用新方法创build自定义控制器:

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

然后我可以在我的控制器中打电话给他们,像这样:

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

这个答案是基于Shamil Yakupov的答案,用真正的对象而不是string。

 using System.Dynamic; dynamic response = new ExpandoObject(); response.message = "Email address already exist"; return Content<object>(HttpStatusCode.BadRequest, response);