私は共通の機能を備えたプロジェクトに取り組んでいます。具体的には、マスターファイルと関連する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を介して配信される静的ファイルのみに関連しているようです。