2009-06-26 6 views
0

Ich habe ein Problem damit, dass mein Browser die Inhaltstypen, die ich in meinen Antworten sende, nicht erkennt und versucht, die Datei herunterzuladen, anstatt sie anzuzeigen.Der Browser erkennt den Content Type-Header nicht korrekt

Ich habe eine generische Handler (mit dem Namen SPARQL.ashx) in ASP.Net geschrieben, die etwas Arbeit und produziert ein Objekt, das von zwei möglichen Arten ist. Entweder erhält es ein SPARQLResultSet oder ein Diagramm und legt dann den entsprechenden Inhaltstyp fest, bevor die entsprechende Save-Methode zum Senden des Inhalts an den Benutzer verwendet wird. Code-Fragment ist unten:

//Execute the Query 
    Object result = store.ExecuteQuery(sparqlquery); 

    if (result is SPARQLResultSet) 
    { 
     //Return as SPARQL Results XML Format 
     context.Response.ContentType = MIMETypesHelper.SPARQL[0]; 
     SPARQLResultSet resultset = (SPARQLResultSet)result; 
     resultset.Save(new StreamWriter(context.Response.OutputStream)); 
    } 
    else if (result is Graph) 
    { 
     //Return as Turtle 
     context.Response.ContentType = MIMETypesHelper.Turtle[0]; 
     Graph g = (Graph)result; 
     TurtleWriter ttlwriter = new TurtleWriter(); 
     ttlwriter.PrettyPrintMode = true; 
     ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream)); 
    } 

Mein Problem ist, dass mein Browser wird oft prompt die Ergebnisse herunterladen, anstatt sie trotz der Tatsache anzeigt, dass ein Format XML basiert und die andere Klartext basiert und so sollten beide anzeigbar in jedem modernen Browser.

Verhalten variiert von Browser zu Browser und einige werden zum Download unabhängig von Ergebnisformat und einige werden für die eine aber nicht die andere aufgefordert.

Muss ich IIS wahrscheinlich irgendwie konfigurieren, um sicherzustellen, dass die richtigen MIME-Typen gesendet werden. Für den Datensatz habe ich die offiziellen Dateierweiterungen und MIME-Typen in IIS registriert. Oder ist das ein Problem mit der Tatsache, dass ich einen generischen Handler verwende? Oder hat jemand andere Ideen, warum dies passieren könnte?

bearbeiten

Added Code aus MIMETypesHelper Klasse für Klarheit

/// <summary> 
/// Helper Class containing arrays of MIME Types for the various RDF Concrete Syntaxes 
/// </summary> 
/// <remarks>The first type in each array is the canonical type that should be used</remarks> 
public class MIMETypesHelper 
{ 
    /// <summary> 
    /// MIME Types for Turtle 
    /// </summary> 
    public static string[] Turtle = { "text/turtle", "application/x-turtle", "application/turtle" }; 

    /// <summary> 
    /// MIME Types for RDF/XML 
    /// </summary> 
    public static string[] RDFXML = { "application/rdf+xml" }; 

    /// <summary> 
    /// MIME Types for Notation 3 
    /// </summary> 
    public static string[] Notation3 = { "text/n3", "text/rdf+n3" }; 

    /// <summary> 
    /// MIME Types for NTriples 
    /// </summary> 
    public static string[] NTriples = { "text/plain" }; 

    /// <summary> 
    /// MIME Types for SPARQL Result Sets 
    /// </summary> 
    public static string[] SPARQL = { "application/sparql-results+xml" }; 

    ///etc. 
} 
+0

Es könnte hilfreich sein, die genauen HTTP-Header, die von Ihrem Dienst zurückgegeben werden, zu posten. In Fiddler (www.fiddler2.com) können Sie einfach mit der rechten Maustaste auf die Sitzung klicken und Kopieren> Überschriften wählen. – EricLaw

Antwort

0

fand schließlich die Ursache des Problems scheint Sie Clear() auf die Antwort rufen und Buffering oder den Content-Type-Header nicht gesendet nicht verwendet erhalten wie erwartet:

zB.

//Return as Turtle 
context.Response.ContentType = MIMETypesHelper.Turtle[0]; 

//Clear any other output from this Response 
//Then use buffering 
context.Response.Clear(); 
context.Response.BufferOutput = true; 

//Write the Output 
Graph g = (Graph)result; 
TurtleWriter ttlwriter = new TurtleWriter(); 
ttlwriter.PrettyPrintMode = true; 
ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream)); 
1

Was ist der Content-Dispostion Header gesetzt? Es sollte auf "Inline" eingestellt sein. Vielleicht möchten Sie es manuell einstellen, um zu sehen, ob sich das Verhalten ändert.

2

Aus Ihrem Code sieht es so aus, als ob Sie sich auf die MIME-Typen in der RDF-Bibliothek verlassen (Sie sagen nicht, welche). Wenn ein Browser wie Firefox/IE (Sie sagen nicht, dass Sie verwenden) sieht einen Mime-Typ application/SOMETHING es bietet in der Regel an, es zu speichern, anstatt es anzuzeigen.

Der MIME-Typ für RDF/XML ist application/rdf+xml (ich weiß, da ich die Spezifikation geschrieben habe) und das wird die Save-as-Ansatz verursachen. Der Mime-Typ für Turtle (den ich in Turtle note erstellt habe) ist nicht registriert, wurde aber als text/turtle vorgeschlagen, was gut angezeigt werden sollte.

+0

Die Bibliothek heißt dotNetRDF, was meine eigene RDF-Implementierung ist (immer noch Pre-Alpha-Version), daher bin ich mit all den RDF-Spezifikationen, die Sie enthalten, vertraut. Die MIME-Typen-Helper-Klasse verfügt über eine Reihe von Arrays, die erkannte MIME-Typen für verschiedene RDF-Syntaxen enthalten. Das erste Element in beiden Arrays (im Code referenziert) ist der Standardtyp für diese Syntax. Verhalten variiert je nach Browser und PC, FF auf meinem Dev-Rechner zeigt SPARQL-Ergebnisse an, lädt aber Turtle herunter, während ein Heimcomputer beides anzeigt. IE/Chrome/Safari weisen alle ähnliche Inkonsistenzen im Verhalten auf. – RobV

+0

Ich bin nicht sicher, ob es eine gute Antwort auf all das gibt, aber @tvanfosson hat einen anderen nützlichen Vorschlag - Content-Disposition http://www.ietf.org/rfc/rfc2183.txt, von dem ich mich erinnere, dass IE ihn verwenden könnte . – dajobe

0

In unserer Familie von RDF-Speicher-Engines greifen wir dieses Problem an, indem wir Content-Negotiation durchführen.

Das heißt, wir überprüfen die Accept-Zeile in den HTTP-Request-Headern und passen unser Verhalten entsprechend an. Wenn in der Zeile "Accept" RDF-Varianten erwähnt werden oder der MIME-Typ für SPARQL-Ergebnisse explizit angegeben wird, senden wir den entsprechenden Inhaltstyp und die zugehörige Antwort zurück. Dies bietet unseren Kunden spezielle SPARQL-Clients, handverwalteten Code und verschiedene RDF- "Browser" -Tools.

Aber für einen typischen Webbrowser listet die Accept-Zeile nur HTML und einige Bildformate auf, und unser HTTP-Daemon setzt den Inhaltstyp auf text/plain (oder für eine leere SPARQL-Abfrage, text/html, mit der Antwort body ist eine Webseite mit einem Formular zum Schreiben von manuellen Abfragen aus einem Webbrowser zum Testen)

Schließlich, wenn die Accept-Header insgesamt fehlt, wissen wir, es ist eine sehr naive Stück Software, höchstwahrscheinlich jemand Perl-Skript oder etwas, und Wir haben einen speziellen Fall, um das Leben der Menschen zu erleichtern, wenn sie sich gegen die Speichermaschine entwickeln.

+0

einige meiner anderen Sachen tun dies, aber das war einfach ein ziemlich SPARQL-Endpunkt ich klopfte, um die SPARQL-Implementierung zu testen, so dass ich keine richtigen 303/Conneg Sachen in diesem Code enthalten – RobV

Verwandte Themen