Frage

Ich habe ein Problem mit meinem Browser der Inhaltstypen zu erkennen, andernfalls ich in meinen Antworten sende und zu versuchen, die Datei herunterzuladen, anstatt sie angezeigt werden kann.

Ich habe einen generischen Handler (benannt SPARQL.ashx) in ASP.Net geschrieben, das einige Arbeit tut und erzeugt ein Objekt, das von zwei möglichen Arten ist. Entweder es wird einen SPARQLResultSet oder ein Diagramm und setzt dann den entsprechenden Inhaltstyp, bevor die entsprechende Methode Save mit dem Inhalt an den Benutzer zu senden. Codefragment ist unter:

  //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 in jedem modernen Browser anzeigbar sein.

variiert Verhalten von Browser zu Browser und einige werden zum Download aufgefordert, unabhängig von Ergebnis-Format und einige werden für einen, aber nicht die andere.

Bin ich wahrscheinlich IIS müssen irgendwie konfigurieren, die richtigen MIME-Typ gesendet werden, zu gewährleisten. Für das Protokoll habe ich die offiziellen Dateiendung und MIME-Typen in IIS registriert. Oder ist dies ein Problem mit der Tatsache, dass ich einen generischen Handler verwendet werden? Oder hat jemand noch andere Ideen, warum dies passiert sein könnte?

Bearbeiten

Code hinzugefügt von 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.
}
War es hilfreich?

Lösung 4

Schließlich fand die Ursache des Problems scheint Sie Clear () auf die Antwort verlangen und nutzen Buffering oder den Content-Type-Header nicht wie erwartet gesendete:

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

Andere Tipps

Von Ihrem Code sieht es aus wie Sie auf dem MIME-Typ in der rdf Bibliothek angewiesen sind (Sie sagen nicht, welche). Wenn ein Browser wie Firefox / IE (Sie nicht sagen, was Sie verwenden) einen MIME-Typ application/ sieht ETWAS es bietet in der Regel um sie zu speichern, anstatt sie sehen.

Der Mime-Typ für RDF / XML ist application/rdf+xml (ich weiß, da ich die Spezifikation geschrieben), und das wird die Save-as-Ansatz führen. Der Mime-Typ für Schildkröte (die ich erstellt in Turtle note ) nicht registriert wurde aber zu text/turtle vorgeschlagen, dem feinen anzeigen soll.

Was ist der Inhalt-dispos Header gesetzt? Es sollte auf „inline“ eingestellt werden. Vielleicht möchten Sie versuchen, es manuell einstellen, um zu sehen, ob das Verhalten ändert.

In unserer Familie von RDF-Speicher-Engines greifen wir dieses Problem durch die Content-Negotiation zu tun.

Das heißt, überprüfen wir die Accept-Linie in den HTTP-Request-Header, und unser Verhalten entsprechend anpassen. Wenn die Accept Linie keine RDF Aromen erwähnt, oder die SPARQL Ergebnisse MIME-Typ explizit, dann senden wir die entsprechenden Content-Type und der zugehörigen Antwort zurück. Dies dient gewidmet SPARQL Kunden, handgerollte Code und verschiedene RDF „Browser“ Tool sehr gut in unserer Erfahrung.

Aber für einen typischen Web-Browser der Accept Zeile HTML-Listen handeln und einige Bildformate, und unser HTTP-Daemon stellt den Content-type text / plain (oder für einen leeren SPARQL Query, text / html, mit dem Antworttext ist eine Web-Seite mit einem Formular für manuelle Abfragen von einem Web-Browser zum Testen schreiben)

Schließlich, wenn die Accept-Header ganz fehlen wissen wir, es ist ein sehr naives Stück Software ist, höchstwahrscheinlich Perl-Skript oder etwas jemand, und wir haben einen Sonderfall für das Leben der Menschen leichter zu machen, wenn sie gegen die Speicher-Engine zu entwickeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top