Pregunta

Tengo un problema con mi navegador que no reconoce los tipos de contenido que envío en mis respuestas y trato de descargar el archivo en lugar de mostrarlo.

Tengo un controlador genérico (llamado SPARQL.ashx) escrito en ASP.Net que funciona y produce un objeto que es de dos tipos posibles. O obtiene un SPARQLResultSet o un Graph y luego establece el tipo de contenido apropiado antes de usar el método Save apropiado para enviar el contenido al usuario. El fragmento de código está debajo:

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

Mi problema es que mi navegador a menudo solicita que descargue los resultados en lugar de mostrarlos a pesar del hecho de que un formato está basado en XML y el otro en texto plano, por lo que ambos deben poder visualizarse en cualquier navegador moderno.

El comportamiento varía de un navegador a otro y algunos solicitarán la descarga independientemente del formato del resultado y algunos lo harán para uno pero no para el otro.

¿Es probable que necesite configurar IIS de alguna manera para asegurar que se envíen los tipos MIME correctos? Para el registro, tengo las extensiones de archivo oficiales y los tipos MIME registrados en IIS. ¿O es un problema con el hecho de que estoy usando un controlador genérico? ¿O alguien tiene alguna otra idea de por qué esto podría estar sucediendo?

Editar

Código agregado de la clase MIMETypesHelper para mayor claridad

/// <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.
}
¿Fue útil?

Solución 4

Finalmente encontré la fuente del problema, parece que tienes que llamar a Clear () en la respuesta y usar Buffering o el encabezado Content Type no se envía como se esperaba:

ej.

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

Otros consejos

De su código parece que está confiando en los tipos MIME en la biblioteca rdf (no dice cuál). Cuando un navegador como firefox / IE (no dice cuál está usando) ve un tipo mime application/ ALGO , generalmente ofrece guardarlo en lugar de verlo.

El tipo mime para RDF / XML es application/rdf+xml (lo sé, desde que escribí la especificación) y eso causará el enfoque de guardar como. El tipo mime para Turtle (que creé en Turtle note ) no es registrado pero se sugirió que fuera text/turtle que debería mostrarse bien.

¿Cuál es el encabezado Content-Dispostion ? Debe establecerse en & Quot; inline & Quot ;. Es posible que desee intentar configurarlo manualmente para ver si el comportamiento cambia.

En nuestra familia de motores de almacenamiento RDF atacamos este problema haciendo negociaciones de contenido.

Es decir, verificamos la línea Aceptar en los encabezados de solicitud HTTP y ajustamos nuestro comportamiento en consecuencia. Si la línea Aceptar menciona cualquier sabor RDF, o el tipo MIME de resultados SPARQL explícitamente, entonces enviaremos el tipo de contenido apropiado y la respuesta asociada. Esto sirve a clientes SPARQL dedicados, código enrollado a mano y varios RDF & Quot; browser & Quot; herramientas muy bien en nuestra experiencia.

Pero para un navegador web típico, la línea Aceptar solo enumera HTML y algunos formatos de imagen, y nuestro demonio HTTP establece el Tipo de contenido en texto / sin formato (o para una consulta SPARQL en blanco, texto / html, con el cuerpo de respuesta ser una página web con un formulario para escribir consultas manuales desde un navegador web para pruebas)

Finalmente, si falta el encabezado Aceptar, sabemos que es un software muy ingenuo, muy probablemente el script Perl de alguien o algo así, y tenemos un caso especial para que haga la vida de las personas más fácil cuando se desarrolla contra el motor de almacenamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top