Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WebAPI 2端点返回自定义HTTP状态代码_C#_Asp.net Web Api_Http Status Code 404 - Fatal编程技术网

C# 从WebAPI 2端点返回自定义HTTP状态代码

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#规范: 枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类

我正在处理WebAPI 2中的一个服务,端点当前返回一个
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;
            }
        }
    }