我为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
属性的引用?
Response
属性上有Exception
个属性。请参阅下面的一个例外情况......
处理HTTP请求导致异常。请参阅 此
的“响应”属性返回的HTTP响应
详情的例外。
答案 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);
}
}