Return 包含 IHttpActionResult 的非 OK 响应内容
Return content with IHttpActionResult for non-OK response
对于来自 Web API 2 控制器的 returning,如果响应正常(状态 200),我可以 return 满意响应,如下所示:
public IHttpActionResult Get()
{
string myResult = ...
return Ok(myResult);
}
如果可能,我想在possible
时使用这里内置的结果类型
我的问题是,对于另一种类型的响应(不是 200),我怎样才能 return 消息(字符串)呢?例如,我可以这样做:
public IHttpActionResult Get()
{
return InternalServerError();
}
但不是这个:
public IHttpActionResult Get()
{
return InternalServerError("Message describing the error here");
}
理想情况下,我希望将其通用化,以便我可以使用 IHttpActionResult 的任何实现发回消息。
我是否需要这样做(并构建我的回复消息):
public IHttpActionResult Get()
{
HttpResponseMessage responseMessage = ...;
return ResponseMessage(responseMessage);
}
或者有更好的方法吗?
您可以使用 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");
任何有兴趣通过返回 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");
然后我这样做了:
1) 使用 singleton
创建自定义结果类型
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) 使用新方法创建自定义控制器:
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));
}
下面的代码/class 确实有助于处理所有类型的响应。可能成功也可能失败等等
我为什么要用这个? :
假设我正在使用网络 API 服务。输出有以下几种可能:
- 由于验证错误,您可能得不到任何结果
- 你会得到预期的结果
- 你会得到错误。
所以这里我有处理所有情况的解决方案。我还试图保持输出的一致性。您可以给出备注或实际错误消息。 Web 服务消费者只能检查 IsSuccess 是否为真,否则将确定有问题,并根据情况采取行动。 Web API 开发人员和 Web API 消费者之间应该有完美的沟通。如果没有生成结果,那么为什么。评论或例外将得到确认,他们将采取相应行动。
因此,这是网络 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.
上写信给我
我建议阅读这篇文章 post。有很多方法可以按照建议使用现有的 HttpResponse,但是如果您想利用 Web Api 2,请考虑使用一些内置的 IHttpActionResult 选项,例如
return Ok()
或
return NotFound()
简单:
return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Your message"));
记得参考System.Net.Http和System.Net.
支持未在 C# 中定义的 HTTP 代码的更详细示例 HttpStatusCode
。
public class MyController : ApiController
{
public IHttpActionResult Get()
{
HttpStatusCode codeNotDefined = (HttpStatusCode)429;
return Content(codeNotDefined, "message to be sent in response body");
}
}
Content
是定义在抽象 class ApiController
中的虚方法,控制器的基础。声明如下:
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
你可以使用这个:
return BadRequest("No data is present in table!!");
对于来自 Web API 2 控制器的 returning,如果响应正常(状态 200),我可以 return 满意响应,如下所示:
public IHttpActionResult Get()
{
string myResult = ...
return Ok(myResult);
}
如果可能,我想在possible
时使用这里内置的结果类型我的问题是,对于另一种类型的响应(不是 200),我怎样才能 return 消息(字符串)呢?例如,我可以这样做:
public IHttpActionResult Get()
{
return InternalServerError();
}
但不是这个:
public IHttpActionResult Get()
{
return InternalServerError("Message describing the error here");
}
理想情况下,我希望将其通用化,以便我可以使用 IHttpActionResult 的任何实现发回消息。
我是否需要这样做(并构建我的回复消息):
public IHttpActionResult Get()
{
HttpResponseMessage responseMessage = ...;
return ResponseMessage(responseMessage);
}
或者有更好的方法吗?
您可以使用 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");
任何有兴趣通过返回 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");
然后我这样做了: 1) 使用 singleton
创建自定义结果类型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) 使用新方法创建自定义控制器:
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));
}
下面的代码/class 确实有助于处理所有类型的响应。可能成功也可能失败等等
我为什么要用这个? :
假设我正在使用网络 API 服务。输出有以下几种可能:
- 由于验证错误,您可能得不到任何结果
- 你会得到预期的结果
- 你会得到错误。
所以这里我有处理所有情况的解决方案。我还试图保持输出的一致性。您可以给出备注或实际错误消息。 Web 服务消费者只能检查 IsSuccess 是否为真,否则将确定有问题,并根据情况采取行动。 Web API 开发人员和 Web API 消费者之间应该有完美的沟通。如果没有生成结果,那么为什么。评论或例外将得到确认,他们将采取相应行动。 因此,这是网络 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.
上写信给我我建议阅读这篇文章 post。有很多方法可以按照建议使用现有的 HttpResponse,但是如果您想利用 Web Api 2,请考虑使用一些内置的 IHttpActionResult 选项,例如
return Ok()
或
return NotFound()
简单:
return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Your message"));
记得参考System.Net.Http和System.Net.
支持未在 C# 中定义的 HTTP 代码的更详细示例 HttpStatusCode
。
public class MyController : ApiController
{
public IHttpActionResult Get()
{
HttpStatusCode codeNotDefined = (HttpStatusCode)429;
return Content(codeNotDefined, "message to be sent in response body");
}
}
Content
是定义在抽象 class ApiController
中的虚方法,控制器的基础。声明如下:
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
你可以使用这个:
return BadRequest("No data is present in table!!");