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 ?
如果您查看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来管理处理程序设置。配置设置。