C# 从WebAPI 2端点返回自定义HTTP状态代码
我正在处理WebAPI 2中的一个服务,端点当前返回一个C# 从WebAPI 2端点返回自定义HTTP状态代码,c#,asp.net-web-api,http-status-code-404,C#,Asp.net Web Api,Http Status Code 404,我正在处理WebAPI 2中的一个服务,端点当前返回一个IHttpActionResult。我想返回一个状态代码422,但由于它不在HttpStatusCode枚举中,我不知道如何发送它,因为所有构造函数都需要一个参数HttpStatusCode 现在,我返回的是BadResult(message),但返回的422+消息对我的客户来说更具描述性和实用性。有什么想法吗?根据C#规范: 枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类
IHttpActionResult
。我想返回一个状态代码422
,但由于它不在HttpStatusCode
枚举中,我不知道如何发送它,因为所有构造函数都需要一个参数HttpStatusCode
现在,我返回的是BadResult(message)
,但返回的422
+消息对我的客户来说更具描述性和实用性。有什么想法吗?根据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")
)
);
}
}
}
学分用于:
你的代码必须是我用这种方式简单而优雅
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
}});
希望对你有帮助 为此,您可能需要使用操作筛选器属性。没什么特别的。只需创建一个类并从c#中的
ActionFilterAttribute
class继承它。然后重写名为OnActionExecuting
的方法以实现此功能。然后在任何控制器的头部使用这个过滤器。下面是一个演示
当您需要在actionfilteratAttribute
中生成基于自定义状态代码的消息时,可以按以下方式编写:
if (necessity_to_send_custom_code)
{
actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
}
希望这有帮助。另一个简化的示例:
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);
受保护的内部虚拟协商内容结果内容(HttpStatusCode statusCode,T值);
我在控制器中使用了一个自定义过滤器,可以捕获任何异常并返回自定义错误结果,因此我需要一种基于异常消息返回自定义消息响应的方法
我正在使用(位于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),但是您应该只返回相关的(安全的)数据,或者您在用例中需要的任何数据。如果您返回“(HttpStatusCode)422
,会发生什么。这是有效的C#但是我没有使用WebAPI 2,以确保它不会被拒绝。否则,您肯定可以使用ASP.NET或ASP.NET MVC返回
422 Unprocessable Entity`和其他post RFC 2616状态,因此,可能可以在WebAPI2中下拉到该状态,但我也不知道,所以无法给出完整答案。我知道在MVC中,当设置HttpResponse时,StatusCode将自动为RFC2616代码设置正确的状态描述,您需要自己设置“不可处理实体”等。对不起,为什么要使用422?它没有在HTTP 1.1规范中定义@ToanNguyen 422是在Web分布式创作和版本控制HTTP扩展(WebDAV)中定义的(另请参见:伟大的解决方案)。我重构了它,并在控制器上创建了一个返回IHttpActionResult的方法。它被简化为“返回状态(404,“某些错误”)。此解决方案来自System.Web.Mvc命名空间,而不是System.Web.Http预期的。您能解释一下为什么我们应该忽略100到200之间的代码吗?
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;
}
}
}