4

私は現在、プラグインのようなシステムを特徴とするプロジェクトに取り組んでいます。Webプロジェクトが起動すると、プラグインdllを探し、GUIを構築します。dllには、埋め込みビューと、画像やJavaScriptなどの埋め込みリソースが含まれています。

  • RazorGenerator(VSプラグイン)を使用してビューからcsファイルを生成します。ビューのビルドアクションは「埋め込みリソース」に設定され、カスタムツールは「RazorGenerator」に設定されます。

  • カスタム仮想パスプロバイダーを使用しています(これと非常によく似ています

  • ネット上で見つけたこの回避策に仮想パスプロバイダーを登録します(これを使用しない場合は意図したとおりに機能しないため、これは必須です):

        var assemblyResourceProvider = new AssemblyResourceProvider();
        var hostingEnvironmentInstance = (HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
        if (hostingEnvironmentInstance == null)
            return;
    
        var mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);
        if (mi == null)
            return;
    
        mi.Invoke(hostingEnvironmentInstance, new object[] { assemblyResourceProvider });
    
  • RouteConfig.csでこれを使用して、埋め込まれたスクリプトと画像ファイルを機能させます。

       routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|png|jpg|exe)(/.*)?" });
    
  • これらの行(さらにあります)をweb.configに追加して、埋め込みソースにパスプロバイダーを使用するようにaspに指示します。

      <add name="AspNetStaticFileHandler-PNG" path="*.png" verb="GET,HEAD" type="System.Web.StaticFileHandler"/>
    
  • Boc.Web.PrecompiledViews dllを使用して、RazorGeneratorによって生成されたパス属性を登録します

    BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly);
    

VisualStudioではすべてが意図したとおりに機能しています。dllに埋め込まれたビューとリソースは、問題なく表示され、機能しています。また、IIS 7.5を使用して、VisualStudioからWebアプリを実行しています。すべての可能性が機能します:

  • Razor Generatorによって生成された仮想パスを指定すると機能します(例: "〜/ Views / ViewTest / Test)
  • リソースプロバイダーを使用するDLLリソースパスを指定すると機能します(例: "DllResources / ViewTest.dll / Views / ViewTest / Test.cshtml)

ただし、Webアプリを展開してIIS 7.5を使用して実行した後、ビュー(ビューのみ!)が表示されません。仮想パス(オプション1)を使用してビューをアドレス指定すると、IISは次のエラーメッセージを表示します。

    The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:

DllResourcesパス(オプション2)を使用してビューをアドレス指定すると、IISは次のエラーメッセージを表示します。

    The file '/Views/ViewTest/DllResources/EmbeddedResourceTest/Views/ViewTest/Test.cshtml' has not been pre-compiled, and cannot be requested.

私はそれを機能させるために今何をすべきかわかりません。私はすべてのステップを他のソリューションに置き換えようとしました。結果は同じです。VSで問題なく動作していますが、展開後にビューが表示されません。

不足しているのはIISの構成ですか?web.configから何かが足りませんか?この問題について私を助けてください。

ありがとう、ノーバート

4

1 に答える 1

0

さて、1週間の苦しみの後、私はついに解決策を思いつきました。問題は、Webプロジェクトの公開にありました。これが私がしたことです:

Microsoft.Netフォルダーにaspnet_compilerを使用してWebアプリを公開しています。これは、成功したWebプロジェクトビルドによってトリガーされたビルド後のイベントでした。このイベントを削除し、Webプロジェクトの.csprojファイルの「AfterBuild」スクリプトに置き換えました。この質問のスクリプトを見つけました。この新しい公開方法により、埋め込まれたビューがついに表示されます。

これが将来誰かに役立つことを願っています。

よろしく、

于 2012-10-26T06:50:34.500 に答える