2015-05-19 90 views
1

我有我的本地IIS中的網站。 該網站的應用程序池處於Clasic模式。ASP.NET MVC路由,TransferRequestHandler不與ClassicMode與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"); 
} 

在我web.cong我添加

<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」not preCondition =「integratedMode,runtimeVersionv4.0」。

如果我在Visual Studio 2013中運行項目工作完美,但是當我在IIS中運行它時不起作用。如果我更改我的IIS的AppPool以集成模式工作。 但我需要在經典模式下擁有AppPool。

當我運行路線(URL)[現場] /sitemapindex.xml在經典模式我得到這個錯誤:

HTTP錯誤500.21 - 內部服務器錯誤 處理程序「HtmlFileHandler」有一個壞模塊「ManagedPipelineHandler」在其模塊列表中

這是我使用的Example Project。 如何在IIS網站的classicMode中使用System.Web.Handlers.TransferRequestHandler?

回答

3

如果你看看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; 
     } 
    }} 
0

帕布洛,你仍然可以通過只是改變你的web.config文件中使用的HttpHandler的部分,而不是處理區域映射在IIS7經典模式下使用的處理程序。以下是說明:https://msdn.microsoft.com/en-us/library/46c5ddfy.aspx

您必須這樣做的原因是,舊版II中的經典IIS管道模式使用了獨立的ISAPI擴展,該擴展位於II和.NET運行時/工作進程之間。在較新的IIs7集成模式下,ISAPI擴展消失並管理.NET工作進程本身內的處理程序。由於您將較舊的經典ISAPI擴展管道部分與較新的IIs7服務器設置混合在一起,因此必須通過較早的web.config設置來管理該處理程序設置。