Web Api错误处理过滤器异常的响应属性未定义

时间:2016-05-10 02:57:22

标签: c# asp.net-web-api

我为ASP.NET Web Api应用程序创建了一个错误处理过滤器,我试图拦截ASP.NET管道处理的所有与传输相关的错误。我正在扩展基础ExceptionFilterAttribute类并覆盖OnException方法。

我要做的是首先检查传入的Exception是否已经有响应,然后使用状态代码等构建一个通用响应对象。OnException方法如下所示...... < / p>

public override void OnException(HttpActionExecutedContext ctx)
        {
            log.Error(ctx.Exception.Message, ctx.Exception);

            if (ctx.Exception.Response.IsNotNull())
            {
                ctx.Response = ApiResponseFactory.CreateErrorResponse(ctx.Response.StatusCode
                    , ctx.Response.ReasonPhrase, ctx.Exception.Message);
            }
            else
            {
                ctx.Response = ApiResponseFactory.CreateErrorResponse(HttpStatusCode.InternalServerError
                    , "server_error"
                    , ctx.Exception);
            }
        }

ApiResponseFactory.CreateErrorResponse方法所做的就是构造一个响应对象,没什么特别的。现在,我遇到的问题是上下文异常的Response属性没有被定义(ctx.Exception.Response)...我显然错过了using语句,但所有的MVC,Web Api和其他NuGet包附带的扩展程序集我发现很难知道哪些“使用语句”和/或我应该引用的程序集和/或包...我认为DLL Hell问题90年代的问题得到了解决。以下是我在此代码文件中引用的using语句...

using log4net;
using Stems.API.Base.Plumbing;
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Filters;

这是NuGet包......

<package id="log4net" version="2.0.5" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net45" />

所以,问题是...... 如何获取对上下文异常的Response属性的引用?

根据@ cableroad的回答更新

Response属性上有Exception个属性。请参阅下面的一个例外情况......

  

处理HTTP请求导致异常。请参阅   此

的“响应”属性返回的HTTP响应

Debugger screenshot

  

详情的例外。

2 个答案:

答案 0 :(得分:1)

HttpActionExecutedContext.Exception中没有响应属性。

你应该检查

if (ctx.Exception!=null)

答案 1 :(得分:0)

嗯,答案就在我面前。出于某种原因,我完全错过Exception属性的类型为System.Exception,但是,分配给该属性的基础类型的类型为System.Web.Http.HttpResponseException。也就是说,我需要做的就是将它投射到正确的类型......

public override void OnException(HttpActionExecutedContext ctx)
{
    log.Error(ctx.Exception.Message, ctx.Exception);
    var ex = ctx.Exception as HttpResponseException;

    if(ex.IsNotNull() && ex.Response.IsNotNull())
    {
        ctx.Response = ApiResponseFactory.CreateErrorResponse(ex.Response.StatusCode
                   , ex.Response.ReasonPhrase, ex.Message);
    }
    else
    {
        ctx.Response = ApiResponseFactory.CreateErrorResponse(HttpStatusCode.InternalServerError
                , "server_error"
                , ctx.Exception);
    }
}