Puede usar esto.
Paso 1. Mapeo de la extensión de archivo a TransferRequestHandler
IIS 7 modo integrado utiliza asignaciones de HTTP Handler Qué punto ruta/verbales combinaciones a un controlador de HTTP. Por ejemplo, hay un mapeo de controlador predeterminado que señala path = "*. Axd" verb = "GET, HEAD, POST, DEBUG" al módulo ISAPI apropiado para la versión de tiempo de ejecución de .NET bajo la cual se ejecuta el sitio. La forma más fácil de ver los controladores predeterminados en IIS Express es ejecutar un sitio en IIS Express, hacer clic con el botón derecho en el icono de IIS Express en la bandeja del sistema, hacer clic en "mostrar todas las aplicaciones" y hacer clic en un sitio. El enlace applicationhost.config en la parte inferior está vinculado, por lo que puede hacer clic en él y cargarlo en Visual Studio.
Si se desplaza hacia la parte inferior, verá que hay un catálogo StaticFile para path="*" verb="*"
que apunta a StaticFileModule,DefaultDocumentModule,DirectoryListingModule
. Eso es lo que manejará su solicitud .html si no hace nada. Entonces, el primer paso es agregar un controlador en su web.config que apuntará a las solicitudes *.html
al TransferRequestHandler
. TransferRequestHandler
es el controlador que se ocupa de las URL sin extensión que está acostumbrado a ver en las rutas de MVC, p. /store/details/5
.
Agregar una asignación de controlador es realmente fácil: simplemente abra su web.config y agréguela al nodo <system.webServer/handlers>
.
<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Tenga en cuenta que usted puede hacer el camino más específico si lo desea. Por ejemplo, si sólo quería para interceptar una petición específica, se puede utilizar la ruta = "sample.html"
Paso 2. Configuración de la ruta
A continuación, tendrá una nueva ruta. Abra App_Start/RouteConfig.cs
y llévelo a la RegisterRoutes
llamada. Mi completa RegisterRoutes
se parece a esto:
routes.MapRoute(
name: "XMLPath",
url: "sitemapindex.xml",
defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
);
Paso 3. Ruta archivos existentes
Eso casi lo cubre, pero hay una cosa más que cuidar - peticiones primordiales que responden a un archivo existente. Si tiene un archivo real llamado myfile.html, el sistema de enrutamiento no permitirá que se ejecute su ruta. Me olvidé de esto, terminé con un error HTTP 500 (desbordamiento de recursión) y tuve que pedirle ayuda a Eilon Lipton.
De todos modos, eso es fácil de arreglar, simplemente agregue routes.RouteExistingFiles = verdadero para el registro de su ruta. Mi llamada completada a RegisterRoutes se ve así:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.RouteExistingFiles = true;
routes.MapRoute(
name: "CrazyPants",
url: "{page}.html",
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 }
);
}
Eso es todo.
He probado mediante la adición de esta acción del controlador:
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://sprint-newhomes.move.com/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://sprint-newhomes.move.com/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");
}
de hecho, me trató este día de hoy, pero no pudo conseguir que funcione, porque he añadido la ruta _after_ la ruta por defecto. Necesita insertarse antes de la ruta predeterminada para que funcione. Gracias. – HaakonL
Recuerde también agregar runAllManagedModulesForAllRequests = "true" para la configuración de sus módulos dentro de system.webServer, de lo contrario, intentará usar el controlador staticfile y devolverá un 404 –
@RaulVejar ¡Gracias! He estado buscando en Internet más de una hora y eres la primera persona en mencionar la pieza de los módulos. Solucionó mi problema. – ddilsaver