gpt4 book ai didi

asp.net-mvc - 使用CaSTLe Windsor的Dynamic Proxies实现ASP.NET MVC错误处理

转载 作者:行者123 更新时间:2023-12-03 08:54:04 25 4
gpt4 key购买 nike

我花了很长时间尝试使ASP.NET MVC [HandleError] attribute在我的网站上工作。使用框架提供的解决方案似乎是一个好主意,但是我无法使它做任何有用的事情。然后,我尝试编写自己的属性(主要是为了使我可以使用调试器进入代码),但是尽管我的代码似乎在做所有正确的事情,但是在执行框架之后,框架接手了并且做了一些神秘的事情。最终,我尝试了MVC Contrib的[Rescue] attribute,虽然更好,但是我仍然无法让它做我想做的事情。

一个问题是,嵌入在aspx/ascx页面中的代码中引发的异常被包装在HttpException和WebHttpException中。

对我来说,另一个问题是系统非常不透明。我本质上是在将输入输入到一个黑盒子中,同时牢记一些期望的输出,但是却不知道(除了文档,它似乎不太准确/透彻)不知道它们之间的关系。

那么该怎么办?

最佳答案

我使用下面的代码尝试Dynamic Proxies in Castle Windsor,它尝试处理数据库错误,对此我有一个特定的Exception(AccessDBException)。

_alreadyAttemptedToShowErrorPage将在错误页面引发Exception的情况下停止无限递归。

对于aspx/ascx代码中存在问题的情况,GetAccessDBException(...)方法可在Exception堆栈中的任何位置找到相关的异常。

该代码要求所有 Controller 都派生一个BaseController类。此类用于添加CreateErrorView(...)方法(因为标准的View(...)方法受到保护)

public class AccessDBExceptionHandlingDynamicProxy : IInterceptor
{
private bool _alreadyAttemptedToShowErrorPage;

public AccessDBExceptionHandlingDynamicProxy()
{
_alreadyAttemptedToShowErrorPage = false;
}

public void Intercept(IInvocation invocation)
{
Contract.Requires(invocation.Proxy is BaseController);

try
{
invocation.Proceed();
}
catch (HttpException e)
{
if (_alreadyAttemptedToShowErrorPage == true) throw e;
_alreadyAttemptedToShowErrorPage = true;

var dbException = GetAccessDBException(e);

if (dbException != null)
{
var baseController = (invocation.Proxy as BaseController);
var view = baseController.CreateErrorView("AccessDBException", new AccessDBExceptionViewModel(dbException));

baseController.Response.Clear();
baseController.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
view.ExecuteResult(baseController.ControllerContext);
baseController.Response.End();
}
else
{
throw e;
}
}
}

private static AccessDBException GetAccessDBException(HttpException e)
{
AccessDBException dbException = null;
Exception current = e;

while (dbException == null && current != null)
{
if (current is AccessDBException) dbException = (current as AccessDBException);
current = current.InnerException;
}

return dbException;
}
}

关于asp.net-mvc - 使用CaSTLe Windsor的Dynamic Proxies实现ASP.NET MVC错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31970946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com