2

我一直在从事一个具有通用功能的项目,特别是我想共享主文件和相关的图像/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 传递的静态文件有关。

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

看看这个帖子。它解释了如何通过 IIS 7 中的虚拟路径提供程序获取静态文件。我相信这将解决您的问题。

于 2011-11-22T02:05:55.213 回答