我一直在从事一个具有通用功能的项目,特别是我想共享主文件和相关的图像/js/等。为此,母版页及其相关文件都被包装到一个“全局”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 的建议,不幸的是没有结果。我的网络配置现在看起来像这样:
<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 确实在工作的怀疑,我注释掉了第三行 ( mi.Invoke(....
) 并重新部署了站点。正如我所怀疑的,它现在由于无法找到 MasterPage 文件而中断。此问题似乎仅与通过 VPP 传递的静态文件有关。