使用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);
- 在IIS7上,WebApi的{“message”:“发生了错误”},而不是在IIS Express中
- 无法在HttpResponseMessage标头上设置Content-Type标头?
- ASP.NET Web Api:所请求的资源不支持http方法“GET”
- 检测到自检参考循环 – 从WebApi获取数据到浏览器
- 如何在HttpClient的HttpRequestMessage上设置一个cookie
- 为什么Thread.CurrentPrincipal需要“等待Task.Yield()”?
- 如何将Web API添加到现有的ASP.NET MVC 4 Web应用程序项目?
- ASP.NET Core API只返回列表的第一个结果
- FromBody不能绑定string参数