ASP.. NET MVC路由,TransferRequestHandler不能在IIS的ClassicMode下工作

本文关键字:IIS ClassicMode 工作 不能 MVC NET 路由 TransferRequestHandler ASP | 更新日期: 2023-09-27 17:49:41

我在本地IIS中有一个网站。此站点的应用程序池在经典模式下。

我正在将一个文件的路径映射到MVC上的路由。

我有这样的路由寄存器

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    //routes.RouteExistingFiles = true;
    routes.MapRoute(
        name: "XMLPath",
        url: "sitemapindex.xml",
        defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
    );
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

在我的控制器中我有这个方法

public FileResult Html()
{
    var stringBuilder = new StringBuilder();
    stringBuilder.AppendLine("<?xml version='"1.0'" encoding='"utf-8'"?>");
    stringBuilder.AppendLine("<sitemapindex xmlns='"http://www.sitemaps.org/schemas/sitemap/0.9'">");
    stringBuilder.AppendLine("<sitemap>");
    stringBuilder.AppendLine("<loc>http://[site]/sitemaps/sitemap_01.xml</loc>");
    stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>");
    stringBuilder.AppendLine("</sitemap>");
    stringBuilder.AppendLine("<sitemap>");
    stringBuilder.AppendLine("<loc>http://[site]/sitemaps/sitemap_02.xml</loc>");
    stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>");
    stringBuilder.AppendLine("</sitemap>");
    stringBuilder.AppendLine("</sitemapindex>");
    var ms = new MemoryStream(Encoding.ASCII.GetBytes(stringBuilder.ToString()));
    Response.AppendHeader("Content-Disposition", "inline;filename=sitemapindex.xml");
    return new FileStreamResult(ms, "text/xml");
}

在我的网上。如果我添加这个

<handlers>
    <add name="HtmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="classicMode,runtimeVersionv4.0" />
    </handlers></system.webServer>
<runtime>

所有这些都类似于http://weblogs.asp.net/jongalloway/asp-net-mvc-routing-intercepting-file-requests-like-index-html-and-what-it-teaches-about-how-routing-works

唯一的区别是使用preCondition="classicMode,runtimeVersionv4.0"而不是preCondition="integratedMode,runtimeVersionv4.0"。

如果我在Visual Studio 2013中运行项目工作完美,但当我在IIS中运行它时不工作。如果我改变我的IIS的appool集成模式工作。但是我需要将appool设置为经典模式。

当我在经典模式下运行Route (url) [site]/sitemapindex.xml时,我得到这个错误:

HTTP错误500.21 -内部服务器错误处理程序"HtmlFileHandler"在其模块列表中有一个坏模块"ManagedPipelineHandler"

这是我正在使用的一个示例项目。如何在IIS站点的classicMode中使用system . web . handler . transferrequesthandler ?

ASP.. NET MVC路由,TransferRequestHandler不能在IIS的ClassicMode下工作

如果您查看TransferRequestHandler的源代码,很明显它要求应用程序以集成模式运行。如果它能够将WorkerRequest类型转换为IIS7WorkerRequest,则意味着它以集成模式运行。

internal class TransferRequestHandler : IHttpHandler {        
    public void ProcessRequest(HttpContext context) {
        IIS7WorkerRequest wr = context.WorkerRequest as IIS7WorkerRequest;
        if (wr == null) {
            throw new PlatformNotSupportedException(SR.GetString(SR.Requires_Iis_Integrated_Mode));
        }            
        wr.ScheduleExecuteUrl(null,
                              null,
                              null,
                              true,
                              context.Request.EntityBody,
                              null,
                              preserveUser: false);            
        context.ApplicationInstance.EnsureReleaseState();
        context.ApplicationInstance.CompleteRequest();
    }
    public bool IsReusable {
        get {
            return true;
        }
    }}

Pablo,你仍然可以通过更改web来映射IIs7上经典模式中使用的Handler。使用httpHandler节而不是handler节。以下是使用说明:https://msdn.microsoft.com/en-us/library/46c5ddfy.aspx

你必须这样做的原因是因为经典IIS管道模式在旧的IIS中使用了一个单独的ISAPI扩展,它位于IIS和。net运行时/工作进程之间。在较新的IIs7集成模式中,ISAPI扩展不再存在,而是在。net工作进程本身内部管理处理程序。因为你将旧的经典ISAPI扩展管道部分与新的is7服务器设置混合在一起,你必须通过旧的web来管理处理程序设置。配置设置。