2012-05-03 32 views
23

我们有一个应用程序使用WebForms .aspx文件来处理所有内容。 Latley我们一直使用预编译的RazorView作为通过在我们的项目中放入一个新的dll来获得nicley分组功能的一种方式。但是现在我们发现我们的预编译视图似乎与我们的VirtualPathProviders冲突。使用预编译的Razor视图和VirtualPathProviders时找不到文件PrecompiledApp.config

当从外部dll加载VirtualPathProviders时,应用程序会尝试为所有请求加载PrecompiledApp.config(而我们没有得到它)​​。提供者被加载反射。我们在与注册相同的项目中有一些VirtualPathProviders,并且它们工作正常,但是当我们通过HostingEnvironment.RegisterVirtualPathProvider注册来自外部dll的提供者时,我们会遇到此问题。

如果我们添加文件PrecompiledApp.config,它会尝试获取_appstart.cshtml等等。我们越来越近了exeption之前有下面的所有文件theese:

  • PrecompiledApp.config
  • _appstart.cshtml
  • _PageStart.cshtml
  • _ViewStart.cshtml
  • 查看/ _ViewStart.cshtml
  • Views/Shared/_ViewStart.cshtml
  • default.cshtml

我们以default.cshtml结束,其余的应用程序工作。由于我们想使用apsx文件作为默认文件,因此这不是一个可接受的解决方案。我们也担心会出现更多的问题,因为我们不知道为什么会发生这种情况。

我们试图加载我们提供的这种方式,但我们仍然得到同样的错误: http://sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/

例外:

Could not find file 'C:\MyApp\PrecompiledApp.config'. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.FileNotFoundException: Could not find file 'C:\MyApp\PrecompiledApp.config'. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 


[FileNotFoundException: Could not find file 'C:\MyApp\PrecompiledApp.config'.] 
    System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12899479 
    System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +2481 
    System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229 
    System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +102 
    System.Web.Hosting.MapPathBasedVirtualFile.Open() +105 
    System.Web.WebPages.BuildManagerWrapper.IsNonUpdatablePrecompiledApp() +157 
    System.Web.WebPages.BuildManagerWrapper..ctor(VirtualPathProvider vpp, IVirtualPathUtility virtualPathUtility) +48 
    System.Web.WebPages.VirtualPathFactoryManager.<.cctor>b__6() +90 
    System.Lazy`1.CreateValue() +12776623 
    System.Lazy`1.LazyInitValue() +355 
    System.Web.WebPages.ApplicationStartPage.ExecuteStartPage(HttpApplication application) +131 
    System.Web.WebPages.WebPageHttpModule.StartApplication(HttpApplication application, Action`1 executeStartPage, EventHandler applicationStart) +98 
    System.Web.WebPages.WebPageHttpModule.InitApplication(HttpApplication application) +75 
    System.Web.WebPages.WebPageHttpModule.Init(HttpApplication application) +268 
    System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +575 
    System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +352 
    System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407 
    System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375 

[HttpException (0x80004005): Could not find file 'C:\MyApp\PrecompiledApp.config'.] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11700992 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141 
    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4869221 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272 

回答

3

你确定你的VirtualPathProvider的FILEEXISTS返回false为PrecompiledApp.config?

IsNonUpdatablePrecompiledApp标志在实际调用Open之前调用vpp上的FileExists,以防止发生异常。