如何捕获PreApplicationStartMethod中生成的异常?

时间:2017-04-26 14:14:54

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

我有一个在中等信任环境中托管的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(String   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,Exception appDomainCreationException)+734

1 个答案:

答案 0 :(得分:-1)

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

即使在蔚蓝的网络应用环境中,这也适用于我。因此,提出提升环境信任级别的方法,但在开发计算机上测试之前,确保它能正常运行,以确保从服务器安全策略中抛出错误。