我一直致力于一个具有共同功能的项目,特别是我想共享主文件和相关的images / js / etc.为此,母版页及其相关文件都被包装到所有“子项目”使用的“全局”DLL中。这一切在开发方面都很有效,但部署产生了一个惊喜,似乎让很多人措手不及:VirtualPathProvider
在预编译时不起作用。
现在感谢this blog post containing a workaround我能够再次尝试让它发挥作用。遗憾的是,它仍然没有。
我选择摆脱我的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上没有生产?
更新11/20/2011
尝试了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>
更新11/21/2011
为了验证我对VirtualPathProvider实际工作的怀疑,我注释掉了第三行(mi.Invoke(....
)并重新部署了该站点。正如我所怀疑的那样,由于无法找到MasterPage文件,它现在已经中断了。此问题似乎仅与通过VPP传递的静态文件有关。
答案 0 :(得分: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>
答案 1 :(得分:2)
问题可能是IIS中默认情况下对静态文件的请求没有通过ASP.NET。
尝试在web.config中启用runAllManagedModulesForAllRequests是否有帮助。 e.g。
<modules runAllManagedModulesForAllRequests="true" />
答案 2 :(得分:2)
看看这个post。它解释了如何通过IIS 7中的虚拟路径提供程序获取静态文件。我相信这将解决您的问题。