【问题标题】:How can I catch exceptions generated in PreApplicationStartMethod?如何捕获 PreApplicationStartMethod 中生成的异常?
【发布时间】:2017-04-26 14:14:53
【问题描述】:

我有一个托管在中等信任环境中的 ASP MVC 应用程序。这意味着唯一可以执行的代码是应用程序信任文件的代码权限中定义的代码。我看到在较新的 MVC 应用程序中调用了一个方法 ExecutePreAppStart()。然后此方法尝试执行LoadAllAssembliesFromAppDomainBinDirectory()。发生这种情况时会生成权限错误

[PolicyException: 无法获取执行权限。]

如果应用尚未被授予执行该程序集的显式权限。这是预期的结果。

这里的问题是在 PreApplicationStartMethod 的实现之前这个错误会冒泡到 global.asax 中的Application_Error。使用 PreApplicationStartMethod 不再是这种情况。由于 PreApplicationStartMethod 不在我控制的代码中,如何捕获可能发生的错误?

我尝试创建自己的 PreApplicationStartMethod 来捕获异常,但它从未到达断点,因为应用程序从未完全加载。

那么,有没有办法为别人的 PreApplicationStartMethod 捕获错误?我的最终目标是能够发布异常。

尝试捕捉错误:

[assembly: System.Web.PreApplicationStartMethod(typeof(mynamespace.Initializer), "Initialize")]

namespace mynamespace
{
    public static class Initializer
    {
        public static void Initialize()
        {
            //Do something here to catch errors/bind event? but I never get this far at runtime
        }
    } 
}

堆栈跟踪:

System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串 assemblyName,布尔型 starDirective) +772
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +259 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +163
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +230
System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +76 System.Web.Compilation.BuildManager.CallPreStartInitMethods(字符串 preStartInitListPath, Boolean& isRefAssemblyLoaded) +343
System.Web.Compilation.BuildManager.ExecutePreAppStart() +176
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, 异常 appDomainCreationException) +734

【问题讨论】:

    标签: c# asp.net-mvc exception-handling


    【解决方案1】:

    我不确定您为什么需要在中等信任环境中运行您的应用程序。 preapplicationstart 方法总是对我有用,并且能够在发生错误时捕获异常。通常,我会运行一个无限的while循环并每隔x分钟执行一次操作。你的代码和我的唯一区别是我通常将 Initializer 类定义为公共类而不是静态的,我只将初始化方法设置为静态。

    即使在 azure web 应用程序环境中,这也适用于我。因此,请设法提升您的环境的信任级别,但在您的开发机器上进行测试之前,请确保它可以正常工作,这样您就可以确定服务器安全策略引发了错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2020-06-15
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多