2

私は共通の機能を備えたプロジェクトに取り組んでいます。具体的には、マスターファイルと関連するimages / js/etcを共有したいと思っていました。そのために、マスターページとその依存ファイルはすべて「グローバル」DLLにラップされ、すべての「サブプロジェクト」で使用されます。これはすべて開発でうまく機能しましたが、展開は多くの人を不意を突かせるような驚きをもたらしましたVirtualPathProvider。プリコンパイルすると機能しません。

回避策を含むこのブログ投稿のおかげで、私はそれを機能させるために別の試みをすることができました。残念ながら、まだそうではありません。

私は自分の実装を取り除くことを選択しGlobal.asax、ブログ投稿のAppInitializeアプローチを採用しました。

public static class AppStart
{
    public static void AppInitialize()
    {
        HostingEnvironment hostingEnvironmentInstance = (HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
        MethodInfo mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);
        mi.Invoke(hostingEnvironmentInstance, new object[] { new MasterPageProvider() });
    }
}

実際のプロバイダーはデバッグで動作するため、ここには含めません。ご覧になりたい方は、お気軽にお問い合わせください。質問をできるだけ短くしたかっただけです。

この状況全体の興味深い側面は、本番環境でマスターページが見つからないというエラーが発生しないことです。私にとって、これはプロバイダー機能していることを意味しますが、何らかの理由で残りのリソース(js / css / etc)がアセンブリから適切に取得されていません。

したがって、私の質問はこれに帰着します。このソリューションが開発ではうまく機能するが、IIS 7.5の本番環境では機能しない理由は何ですか?


更新2011年11月20日

David Ebboの提案を試しましたが、残念ながら結果はありませんでした。私のWeb設定は次のようになります。

<configuration>
    <connectionStrings>
        <clear />
        <!-- ... -->
    </connectionStrings>
    <system.web>
        <pages>
            <controls>
                <!-- ... -->
            </controls>
        </pages>
        <compilation debug="true" targetFramework="4.0" />
        <webServices>
            <protocols>
                <add name="HttpGet"/>
                <add name="HttpPost"/>
            </protocols>
        </webServices>
    </system.web>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
</configuration>

更新2011年11月21日

VirtualPathProviderが実際に機能しているという疑いを確認するために、3行目(mi.Invoke(....)をコメントアウトして、サイトを再デプロイしました。思ったとおり、MasterPageファイルが見つからないために壊れてしまいました。この問題は、VPPを介して配信される静的ファイルのみに関連しているようです。

4

3 に答える 3

3

IIS 7.5は、静的ファイル自体を処理します。無視する静的ファイルごとにweb.configファイルに行を入れて、VPPを介してルーティングされるようにする必要があります。例については、以下を参照してください。

<system.webServer>
    <handlers>
        <add name="Images" path="*.png" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" />
        <add name="Stylesheets" path="*.css" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" modules="ManagedPipelineHandler" resourceType="Unspecified" />
     </handlers>
 </system.webServer>
于 2011-11-22T08:31:08.807 に答える
2

おそらく問題は、静的ファイルの要求がIISのデフォルトでASP.NETを経由しないことです。

web.configでrunAllManagedModulesForAllRequestsをオンにすることが役立つかどうか試してください。例えば

<modules runAllManagedModulesForAllRequests="true" />
于 2011-11-19T20:36:29.600 に答える
2

この投稿を見てください。IIS7の仮想パスプロバイダーを介して静的ファイルを取得する方法について説明します。これで問題が解決すると思います。

于 2011-11-22T02:05:55.213 に答える