我正在使用WebAPI 2中的服务,端点当前返回IHttpActionResult
。我想返回一个状态代码422
,但因为它不在HttpStatusCode
枚举中,所以我不知道如何发送它,因为所有构造函数都需要一个参数HttpStatusCode
现在,我正在返回BadResult(message)
,但返回422
+消息对我的客户来说更具描述性和实用性。有什么想法吗?
答案 0 :(得分:74)
根据C#规范:
枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类型的唯一有效值
因此,您可以将状态代码422转换为HttpStatusCode。
控制器示例:
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace CompanyName.Controllers.Api
{
[RoutePrefix("services/noop")]
[AllowAnonymous]
public class NoOpController : ApiController
{
[Route]
[HttpGet]
public IHttpActionResult GetNoop()
{
return new System.Web.Http.Results.ResponseMessageResult(
Request.CreateErrorResponse(
(HttpStatusCode)422,
new HttpError("Something goes wrong")
)
);
}
}
}
答案 1 :(得分:20)
return Content((HttpStatusCode) 422, whatEver);
信用是:Return content with IHttpActionResult for non-OK response
,您的代码必须为< = 999
请忽略100到200之间的代码。
答案 2 :(得分:3)
我用这种方式简单而优雅。
public ActionResult Validate(User user)
{
return new HttpStatusCodeResult((HttpStatusCode)500,
"My custom internal server error.");
}
然后是角度控制器。
function errorCallBack(response) {
$scope.response = {
code: response.status,
text: response.statusText
}});
希望它对你有所帮助。
答案 3 :(得分:0)
为此,您可能需要使用动作过滤器属性。没有什么花哨。只需创建一个类并从c#中的ActionFilterAttribute
类继承即可。然后重写一个名为OnActionExecuting
的方法来实现此目的。然后,只需在任何控制器的头上使用此过滤器即可。以下是一个演示。
在需要在ActionFilterAttribute
中生成基于自定义状态代码的消息的情况下,可以通过以下方式编写:
if (necessity_to_send_custom_code)
{
actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
}
希望这会有所帮助。
答案 4 :(得分:0)
另一个简化的示例:
public class MyController : ApiController
{
public IHttpActionResult Get()
{
HttpStatusCode codeNotDefined = (HttpStatusCode)422;
return Content(codeNotDefined, "message to be sent in response body");
}
}
Content
是在抽象类ApiController
(控制器的基础)中定义的虚拟方法。参见以下声明:
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
答案 5 :(得分:0)
我在控制器中使用了一个自定义过滤器,该过滤器会捕获所有异常并返回自定义错误结果,因此我需要一种基于异常消息返回自定义消息响应的方法。
我正在使用JsonResult(位于Microsoft.AspNetCore.Mvc命名空间中)返回自定义状态代码和消息,例如:
public class DomainViolationFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
switch (context.Exception)
{
case EntityNotFoundException e:
JsonResult toReturn = new JsonResult(e);
toReturn.StatusCode = 404;
context.Result = toReturn;
return;
}
}
}
就我而言,为简单起见,我直接对异常对象(ex)进行序列化,但您应该只返回相关(安全)的数据,或用例中需要的任何数据。