Asp.net VirtualPathProvider没有';在iis7.5上进行生产性工作

Asp.net VirtualPathProvider没有';在iis7.5上进行生产性工作,asp.net,virtualpathprovider,Asp.net,Virtualpathprovider,我一直在从事一个具有公共功能的项目,特别是我想共享主文件和相关图像/js/等。为此,主控页及其相关文件都打包到一个“全局”DLL中,供所有“子项目”使用。这一切在开发中都非常有效,但部署带来了一个惊喜,这似乎让很多人措手不及:VirtualPathProvider在预编译时不工作 现在多亏了我,我才能够再次尝试让它发挥作用。遗憾的是,它仍然没有 我选择放弃了我的Global.asax实现,并采用了博客文章的AppInitialize方法: public static class AppStart

我一直在从事一个具有公共功能的项目,特别是我想共享主文件和相关图像/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)都无法从程序集中正确检索

所以我的问题可以归结为:为什么这个解决方案在IIS7.5上的开发中效果很好,但在生产中却不起作用


2011年11月20日更新

尝试了大卫·埃博的建议,但不幸没有结果。我的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实际工作的怀疑,我注释掉了第三行(
mi.Invoke(…
)并重新部署了该站点。正如我所怀疑的,它现在由于找不到母版页文件而中断。此问题似乎只与通过VPP传递的静态文件有关。

可能问题在于,在IIS中,静态文件的请求在默认情况下不会通过ASP.NET

尝试在web.config中打开runAllManagedModulesForAllRequests是否有帮助

<modules runAllManagedModulesForAllRequests="true" />

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

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>


不幸的是,这一次我没有掷骰子。我尝试了一下,并用尝试的细节更新了我的问题。不过谢谢你的建议。我下班后会尝试一下。这似乎是我最新发现的答案(至少一切都适合)。感谢您的帮助!非常感谢您的帮助。这已经困扰了我好几个星期了!我以前遇到过一次,但没有考虑到IIS现在本身提供静态文件。享受225代表!如果您愿意稍微扩展您的答案,您应该提一下,您可能需要每个扩展一个处理程序。此外,我认为你不需要后置动词(不是说它一定会导致任何不好的事情,而是…)。