我们有一个应用程序,使用WebForms.aspx文件来处理几乎所有内容。Latley我们一直在使用预编译的RazorViews作为通过简单地在我们的项目中放置一个新的dll来获得nicley打包功能的一种方式。但是现在我们发现我们的预编译视图似乎与我们的VirtualPathProviders冲突。
当从外部dll加载VirtualPathProviders时,应用程序会尝试为所有请求加载预编译App.config(我们没有得到它(。提供程序加载了反射。我们在与注册相同的项目中有一些 VirtualPathProviders,它们工作正常,但是当我们使用HostingEnvironment.RegisterVirtualPathProvider
从外部 dll 注册提供程序时,我们会遇到这个问题。
如果我们添加文件预编译App.config,它会尝试获取_appstart.cshtml等。在通过执行之前,我们必须在下面拥有所有文件:
- 预编译应用.config
- _appstart.cshtml
- _PageStart.cshtml
- _ViewStart.cshtml
- Views/_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:MyAppPrecompiledApp.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:MyAppPrecompiledApp.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:MyAppPrecompiledApp.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:MyAppPrecompiledApp.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
你确定你的 VirtualPathProvider 的 FileExists 对于预编译App.config 返回 false 吗?
IsNonUpdatablePrecompiledApp 标志在实际调用 Open 之前调用 vpp 上的 FileExists,以防止发生异常。