2010-01-05 31 views

Respuesta

14

Añadir un mapa para:

routes.MapRoute(
      "Sitemap", 
      "sitemap.xml", 
      new { controller = "Home", action = "SiteMap" } 
      ); 

en cuenta que las rutas, el controlador y las opciones de acción están codificados.

+7

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

+12

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 –

+0

@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

6

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"); 
} 
+0

Aunque esta respuesta puede ser correcta, sería mejor incluir aquí el código correspondiente. Las respuestas solo de enlace pueden volverse incorrectas si el sitio web se mueve o se elimina. – Jonathan

0

para conseguir que esto funcione es necesario hacer 2 cosas:

  1. instruir a los IIS para permitir que la petición de archivo estático "/Mapa del sitio .xml "para golpear su controlador. De lo contrario, IIS omitirá su aplicación y buscará directamente un archivo con este nombre. Agregue la siguiente línea a su web.config:
<system.webServer> 
    <handlers> 

     <!-- add the following line --> 
     <add name="SitemapXml" path="sitemap.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> 

    </handlers> 
</system.webServer> 
  1. lugar una ruta en su aplicación MVC que coincida con esta solicitud a un ActionResult (asegúrese de colocar antes de su ruta por defecto):
routes.MapRoute(
    name: "Sitemap", 
    url: "sitemap.xml", 
    defaults: new { controller = "YourControllerName", action = "YourActionName" } 
); 
Cuestiones relacionadas