none
HTTP-Fehler 404.0 bei XML-Datei senden mit Response.Write

    Frage

  • Ich möchte mir eine sitemap.xml für meine Webseite dynamisch erstellen und mit Response.Write senden. Den String für sitemap.xml bekomme ich und kann ihn als Datei ablegen.

    Wenn ich

    Response.ContentType = "text/xml";

    Response.ContentEncoding = System.Text.Encoding.UTF8;

    Response.Write(smx.GetSiteMapString());

    Response.End();

    ausführe bekomme ich einen Fehler:

    HTTP-Fehler 404.0 - Not Found

    Modul: IIS Web Core

    Benachrichtigung: MapRequestHandler

    Handler: StaticFile

    Fehlercode: 0x80070002

    Als erstes habe ich geprüft, ob Statischer Inhalt in der IIS Konfiguration  unter WWW-Dienste -> Gemeinsam genutzte http-Features -> Statischer Inhalt aktiviert ist – ist aktiviert

    Danach habe ich einen Hinweis auf <system.webServer><staticContent><mimeMap…  gelesen und folgendes eingetragen:

    <system.webServer>

       <staticContent>

          <mimeMap fileExtension=".xml" mimeType="text/xml" />

       </staticContent>

    </system.webServer>

     

    Mit dieser Änderung erhalte ich

    http-Fehler 5019 – Internal Error

    Konfigurationsdaten ungültig

    Handler: StaticFile

    Fehlercode: 0x800700b7

    Konfigurationsfehler: Doppelter Auflistungseintrag vom Typ "mimeMap" mit auf ".xml" festgelegtem eindeutigen Schlüsselattribut "fileExtension" kann nicht hinzugefügt werden.

    Der Dateityp stand auch schon in den IIS MIME Typen drin…

    Wenn ich die sitemap.xml als Datei in das Projekt aufnehme und veröffentliche kommt die Datei auf dem Client richtig an. 

    Was mache ich hier falsch?  Vielen Dank für Eure Tips.

    Andreas



    • Bearbeitet AndreasM85 Sonntag, 10. November 2013 07:31
    Sonntag, 10. November 2013 07:29

Antworten

  • Hallo Andreas,

    wie rufst Du die Datei denn auf? http://server/sitemap.xml? Falls ja, musst Du natürlich erstmal dafür sorgen, dass dein Skript auch auf diesen Aufruf reagiert.

    Sinnvollerweise macht man sowas mit einem Handler (ASHX) der den Dateiinhalt dann sendet.

    Die Verbindung des Aufrufs zur sitemap.xml zum Handler kannst Du über die web.config herstellen. Je nach genauen Einstellungen der Anwendung und des Application Pools bspw. so:

    <?xml version="1.0"?>
    <configuration>
        ...
        
        <system.web>
            ...
            
            <urlMappings>
                <add url="~/sitemap.xml" mappedUrl="~/Handler/Sitemap.ashx"/>
            </urlMappings>
        </system.web>
    </configuration>
    

    Falls das nicht klappt, schau mal, ob deine Anwendung und der Application Pool im IIS mit .NET 4 bzw. 4.5 arbeiten.

    Im Handler selbst kannst Du dann so ähnlich wie in deinem Code vorgehen.

    Falls Du die urlMappings nicht verwenden kannst, kann man den Handler auch explizit angeben:

        <system.web>
            <httpHandlers>
                <add verb="*" path="sitemap.xml" type="Namespace.Klasse" validate="false"/>
            </httpHandlers>
        </system.web>
    
        <system.webServer>
            ...
            <handlers>
                <add name="SitemapXmlHandler" verb="*" path="sitemap.xml" type="Namespace.Klasse"/>
            </handlers>
        </system.webServer>
    
    Namespace.Klasse musst Du dann noch anhand der Angaben in deinem Handler anpassen. Wenn der nicht in derselben Assembly steckt, musst Du deren Namen noch mit angeben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AndreasM85 Samstag, 16. November 2013 17:40
    Samstag, 16. November 2013 14:00

Alle Antworten

  • Hallo Bogdan,

    das hat leider nicht geholfen. 

    Eine neue Erkenntnis habe ich: wenn ich das ganze über den IIS Express aufrufe, funktioniert es. Es scheint kein Fehler im Code zu sein. 

    Ich benutze IIS V7.5 (Win 7 SP1 64Bit )

    Samstag, 16. November 2013 13:36
  • Hallo Andreas,

    wie rufst Du die Datei denn auf? http://server/sitemap.xml? Falls ja, musst Du natürlich erstmal dafür sorgen, dass dein Skript auch auf diesen Aufruf reagiert.

    Sinnvollerweise macht man sowas mit einem Handler (ASHX) der den Dateiinhalt dann sendet.

    Die Verbindung des Aufrufs zur sitemap.xml zum Handler kannst Du über die web.config herstellen. Je nach genauen Einstellungen der Anwendung und des Application Pools bspw. so:

    <?xml version="1.0"?>
    <configuration>
        ...
        
        <system.web>
            ...
            
            <urlMappings>
                <add url="~/sitemap.xml" mappedUrl="~/Handler/Sitemap.ashx"/>
            </urlMappings>
        </system.web>
    </configuration>
    

    Falls das nicht klappt, schau mal, ob deine Anwendung und der Application Pool im IIS mit .NET 4 bzw. 4.5 arbeiten.

    Im Handler selbst kannst Du dann so ähnlich wie in deinem Code vorgehen.

    Falls Du die urlMappings nicht verwenden kannst, kann man den Handler auch explizit angeben:

        <system.web>
            <httpHandlers>
                <add verb="*" path="sitemap.xml" type="Namespace.Klasse" validate="false"/>
            </httpHandlers>
        </system.web>
    
        <system.webServer>
            ...
            <handlers>
                <add name="SitemapXmlHandler" verb="*" path="sitemap.xml" type="Namespace.Klasse"/>
            </handlers>
        </system.webServer>
    
    Namespace.Klasse musst Du dann noch anhand der Angaben in deinem Handler anpassen. Wenn der nicht in derselben Assembly steckt, musst Du deren Namen noch mit angeben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AndreasM85 Samstag, 16. November 2013 17:40
    Samstag, 16. November 2013 14:00
  • Hallo Stefan,

    das funktioniert so. Die Lösung war der Dateihandler. Bisher habe ich den Code in Application_BeginRequest (global.asax) untergebracht. Wenn eine Datei sitemap.xml gerufen wird, dann das XML schicken.

    Danke.

    Andreas

    Samstag, 16. November 2013 17:45