24

ほぼすべてに WebForms .aspx ファイルを使用するアプリケーションがあります。Latley では、プロジェクトに新しい dll をドロップするだけで、nicley パケット化された機能を取得する方法として、プリコンパイル済みの RazorViews を使用してきました。しかし、プリコンパイルされたビューが VirtualPathProvider と競合しているように見えることがわかりました。

外部 dll から VirtualPathProviders をロードするとき、アプリケーションはすべての要求に対して PrecompiledApp.config をロードしようとします (そして、それを取得できませんでした)。プロバイダーにはリフレクションがロードされます。登録と同じプロジェクトにいくつかの VirtualPathProviders があり、それらは正常に動作しますが、外部 dll からプロバイダーを登録するとHostingEnvironment.RegisterVirtualPathProvider、この問題が発生します。

ファイル PrecompiledApp.config を追加すると、_appstart.cshtml などを取得しようとします。例外を通過する前に、これらすべてのファイルを以下に用意する必要があります。

  • PrecompiledApp.config
  • _appstart.cshtml
  • _PageStart.cshtml
  • _ViewStart.cshtml
  • ビュー/_ViewStart.cshtml
  • ビュー/共有/_ViewStart.cshtml
  • default.cshtml

最終的には default.cshtml になり、残りのアプリケーションは機能します。デフォルトとして apsx-files を使用したいので、これは受け入れられる解決策ではありません。また、原因がわからないため、今後さらに問題が発生することも懸念されます。

この方法でプロバイダーをロードしようとしましたが、それでも同じエラーが発生します: 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
4

1 に答える 1

3

VirtualPathProvider の FileExists が PrecompiledApp.config に対して false を返すことは確かですか?

IsNonUpdatablePrecompiledApp フラグは、実際に Open を呼び出す前に vpp で FileExists を呼び出して、例外の発生を防ぎます。

于 2012-06-14T23:47:50.230 に答える