返回内容与IHttpActionResult非ok响应

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

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

如果可能,我希望在可能的 . 0时使用内置结果类型

我的问题是,对于另一种类型的响应(不是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);
}

还是有更好的办法?

283405 次浏览

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

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

最好基于请求创建响应,以利用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
}

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

@mayabelle你可以创建IHttpActionResult具体和包装这些代码像这样:

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 InternalServerError(new Exception("SOME CUSTOM MESSAGE"));

你可以用这个:

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

任何对返回任何statuscode和ResponseMessage感兴趣的人:

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

抱歉回答晚了为什么不简单使用

return BadRequest("your message");

我用它来处理所有的IHttpActionResult错误,它工作得很好

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

在ASP。NET Web API 2,你可以将任意ResponseMessage包装在ResponseMessageResult中:

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

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

我也有同样的问题。我想为我的api控制器创建自定义结果,像这样调用它们 return Ok("some text"); < / p > 然后我做了这个: 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();
}

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

using System.Dynamic;


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


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

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

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

下面的代码/类确实有助于处理所有类型的响应。可能是成功或失败等。

为什么要用这个?:

假设我正在使用web API服务。输出有如下几种可能性:

  1. 由于验证错误,您可能得不到任何结果
  2. 你会得到预期的结果
  3. 你会得到错误。

所以这里我有解决所有情况的方案。我还试图保持输出的一致性。您可以给出注释或实际错误信息。web服务消费者只能检查IsSuccess是否为真,否则将确定有问题,并根据情况采取行动。web API开发者和web API消费者之间应该有完美的沟通。如果结果没有产生,那么为什么。注释或异常将被确认,并且它们将相应地采取行动。 因此,这是web API消费者/用户的最佳解决方案

对所有类型结果的单一响应

  public class Response
{
/// <summary>
/// Gets or sets a value indicating whether this instance is success.
/// </summary>
/// <value>
/// <c>true</c> if this instance is success; otherwise, <c>false</c>.
/// </value>
public bool IsSuccess { get; set; } = false;
    

/// <summary>
/// Actual response if succeed
/// </summary>
/// <value>
/// Actual response if succeed
/// </value>
public object Data { get; set; } = null;
    

/// <summary>
/// Remark if anythig to convey
/// </summary>
/// <value>
/// Remark if anythig to convey
/// </value>
public string Remark { get; set; } = string.Empty;
/// <summary>
/// Gets or sets the error message.
/// </summary>
/// <value>
/// The error message.
/// </value>
public object ErrorMessage { get; set; } = null;
    

       

}
    







[HttpGet]
public IHttpActionResult Employees()
{
Response _res = new Response();
try
{
DalTest objDal = new DalTest();
_res.Data = objDal.GetTestData();
_res.IsSuccess = true;
return Request.CreateResponse(HttpStatusCode.OK, _res);
}
catch (Exception ex)
{
_res.IsSuccess = false;
_res.ErrorMessage = ex;
return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res ));
}
}

如有任何建议,欢迎您提出:)

如果有人使用并从中受益,我很高兴。如果有任何增加或修改使这更完善,请在akhandagale65@gmail.com上写信给我。

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

return Ok()

return NotFound()

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

简单:

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

记住引用System.Net.Http系统。网

一个更详细的示例,支持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 BadRequest("No data is present in table!!");