MVC: Jak trasa /sitemap.xml na ActionResult?

hlasů
9

Mám SitemapActionResult který přepíše ActionResult, a dodává SEO sitemap.xml když http://www.sprelle.no/Home/SiteMap je hit. Zatím je vše dobré.

Co bych rád, i když je sloužit sitemap.xml Když Google návštěv /sitemap.xml. K tomu, aby fungovalo, musím trasu, která vidí „sitemap.xml“ a přesměruje na / Home / stránek.

Jak mohu vytvořit toto mapování (v tabulce Trasy)?

Položena 05/01/2010 v 15:18
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
14

Přidání mapy pro:

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

Všimněte si, že cesta, regulátor a možnosti akce jsou pevně zakódovány.

Odpovězeno 05/01/2010 v 15:22
zdroj uživatelem

hlasů
6

Můžete použit tento.

Krok 1. Mapování příponu souboru TransferRequestHandler

IIS 7 Integrovaný režim používá mapování HTTP Handler kterém místě path / slovesné kombinace na popisovač HTTP. Například, tam je výchozí handler mapování, který ukazuje cestu = „*. AXD“ sloveso = „GET, HEAD, POST, ladit“ do příslušného modulu ISAPI pro rozhraní .NET runtime verzi webu s operačním systémem. Nejjednodušší způsob, jak vidět výchozí obslužné části IIS Express je spustit web pod IIS Express, klepněte pravým tlačítkem myši na ikonu IIS Express v systémové liště, klikněte na „Zobrazit všechny aplikace“ a klepněte na webu. Odkaz ApplicationHost.config v dolní části spojena, takže stačí kliknout na něj a měl by načíst v Visual Studio.

Pokud přejdete ke dnu, uvidíte, že tam je catchall StaticFile mapování path="*" verb="*"což ukazuje na StaticFileModule,DefaultDocumentModule,DirectoryListingModule. To je to, co se bude pracovat se svou .html požadavek, pokud nemáte nic. Takže prvním krokem je přidat obsluhu ve své web.config, který bude ukazovat *.htmlžádosti o přístup do TransferRequestHandler. TransferRequestHandlerje psovod, který se stará o bez přípony URL jste zvyklí vídat v MVC trasách, např /store/details/5.

Přidání mapování popisovač je opravdu jednoduché - stačí otevřít svůj web.config a přidat ji do <system.webServer/handlers>uzlu.

<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Všimněte si, že můžete udělat cesta konkrétnější, pokud budete chtít. Například, pokud jste jen chtěli zachytit jeden konkrétní požadavek, můžete použít path = „sample.html“

Krok 2. Konfigurace trasu

Dále budete potřebovat novou trasu. Otevírají App_Start/RouteConfig.csa to do RegisterRouteshovoru. Celý můj RegisterRoutesvypadá takto:

  routes.MapRoute(
       name: "XMLPath",
       url: "sitemapindex.xml",
       defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
   );

Krok 3. Trasa existujících souborů

Že téměř kryty, ale je tu ještě jedna věc, starat se o - kategorických požadavků, které odpovídají existující soubor. Pokud máte aktuální soubor s názvem mujsoubor.html bude směrovací systém nedovolí vaše cesta k běhu. Zapomněl jsem o tom, skončil s 500 chybě HTTP (přetečení rekurze) a musel požádat Eilon Lipton o pomoc.

Tak jako tak, je to snadno opravit - stačí přidat routes.RouteExistingFiles = true do svého zápisu trasy. Můj dokončena RegisterRoutes volání vypadá takto:

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 }
            );
    }

A je to.

Testoval jsem přidáním této akce řadič:

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");
}
Odpovězeno 19/05/2015 v 02:05
zdroj uživatelem

hlasů
0

Chcete-li získat tuto práci je třeba udělat 2 věci:

  1. Pokyn IIS povolit statických souborů požadavek „ /sitemap.xml “ zasáhnout řadič. V opačném případě bude IIS obejít vaši přihlášku a dívat se přímo pro soubor s tímto jménem. Přidejte následující řádek do souboru 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. Umístěte trasy v aplikaci MVC, který odpovídá tento požadavek na ActionResult (ujistěte se, že jste jej umístit před výchozí trasa):
routes.MapRoute(
    name: "Sitemap",
    url: "sitemap.xml",
    defaults: new { controller = "YourControllerName", action = "YourActionName" }
);
Odpovězeno 10/12/2017 v 12:18
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more