WebApi v2 ExceptionHandler 不适用于 HttpPost

Posted

技术标签:

【中文标题】WebApi v2 ExceptionHandler 不适用于 HttpPost【英文标题】:WebApi v2 ExceptionHandler not working with HttpPost 【发布时间】:2018-07-26 23:40:22 【问题描述】:

为什么在调用 HTTP 方法发布时从不调用自定义 ExceptionHandler 而是标准响应

这是我的代码

WebApiConfig.cs

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        // Web API configuration and services
        //Handler Custom Exception
        config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler());

        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);

        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new JsonOutputDateTime());
        // Web API routes
        config.MapHttpAttributeRoutes();

        // Remove the XML formatter (Json Only)
        config.Formatters.Remove(config.Formatters.XmlFormatter);

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/v1/controller/action/id",
            defaults: new  id = RouteParameter.Optional 
        );
    

ExceptionHandler.cs

 public class CustomExceptionHandler : System.Web.Http.ExceptionHandling.ExceptionHandler

    public override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    
        SystemExceptionReturn returnObj = new SystemExceptionReturn();
        returnObj.responseCode = "xxxx";
        returnObj.responseMessage = "System Error";     
        var response = context.Request.CreateResponse(HttpStatusCode.OK, returnObj);
        context.Result = new ResponseMessageResult(response);

        return base.HandleAsync(context, cancellationToken);
    

    public virtual bool ShouldHandle(ExceptionHandlerContext context)
    
        return true;
    
    private class TextPlainErrorResult : IHttpActionResult
    
        public HttpRequestMessage Request  get; set; 

        public string Content  get; set; 

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        
            HttpResponseMessage response =
                             new HttpResponseMessage(HttpStatusCode.InternalServerError);
            response.Content = new StringContent(Content);
            response.RequestMessage = Request;
            return Task.FromResult(response);
        
    

Global.asax.xs

public class WebApiApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        AreaRegistration.RegisterAllAreas();

        GlobalConfiguration.Configure(WebApiConfig.Register);

    


我的控制器

public class gController : ApiController
       
    [HttpPost]
    public bool haha(int id)
    
        bool res = false;
        try
        
            int ans = id / 0;
        
        catch (Exception ex)
        
            throw ex;
        
        return res;
           

我调用 localhost:xxxx/api/v1/g/haha 时的这个响应


    "Message": "An error has occurred.",
    "ExceptionMessage": "Attempted to divide by zero.",
    "ExceptionType": "System.DivideByZeroException"

但是当我将 HttpPost 更改为 HttpGet 时,它对我有用。

请有人帮助我

对不起我的英语

更新

我发现在 localhost 中的测试不起作用,但是当部署到 IIS 时它起作用 非常感谢您的帮助

【问题讨论】:

您能分享一下您将 POST 更改为 GET 时得到的响应吗? GET 响应 "responseCode":"xxxx","re​​sponseMessage":"系统错误" 【参考方案1】:

发送 POST 请求到localhost:xxxx/api/v1/g/haha URL 如果您更改要接收 [FromBody] 的 Id 参数,它将起作用。

        [HttpPost]
        public bool haha([FromBody]int id)
        
            bool res = false;
            try
            
                int ans = id / 0;
            
            catch (Exception ex)
            
                throw ex;
            
            return res;
         

【讨论】:

发送post请求时是否在body中添加了id参数? 这不是因为 [FromBody] 属性,这更多是已知的 CORS 问题,尽管我同意 OP 没有提供带有查询参数的完整链接,从而导致混淆

以上是关于WebApi v2 ExceptionHandler 不适用于 HttpPost的主要内容,如果未能解决你的问题,请参考以下文章

WebApi v2 ExceptionHandler 不适用于 HttpPost

WebApi v2 不接受 text/plain 媒体类型

WebAPI BadRequest删除响应数据

ASP.NET MVC通用权限管理系统源代码开源发布(AngelRM_MVC)v2.1

使用 v2.0 端点的声明中缺少 UPN

Web API接口