Pergunta

Eu tenho um problema com o meu navegador não reconhecer os tipos de conteúdo que eu estou enviando em minhas respostas e tentando baixar o arquivo em vez de exibi-lo.

Eu tenho um manipulador genérico (chamado SPARQL.ashx) escrito em ASP.Net que faz algum trabalho e produz um objeto que é de dois tipos possíveis. Ou ele fica um SPARQLResultSet ou um gráfico e, em seguida, define o tipo de conteúdo apropriado antes de usar o método Save adequado para enviar o conteúdo para o usuário. fragmento de código está abaixo:

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

Meu problema é que o meu navegador, muitas vezes, pedido para transferir os resultados, em vez de exibi-los, apesar do fato de que um formato é baseado em XML e outro texto simples baseado e assim ambos devem ser apresentável em qualquer navegador moderno.

Comportamento varia de navegador para navegador e alguns vão pedir para download independentemente do formato resultado e alguns vão para um, mas não o outro.

Am I propensos a necessidade de configurar o IIS de alguma forma para garantir o MIME correto tipos são enviados. Para o registro eu tenho as extensões dos arquivos oficiais e tipos MIME registrados no IIS. Ou este é um problema com o fato de que eu estou usando um manipulador genérico? Ou alguém tem alguma outra idéia por que isso pode estar acontecendo?

Editar

Adicionado código de classe MIMETypesHelper para maior clareza

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

Solução 4

Finalmente encontrou a origem do problema, parece que você tem que chamar Clear () sobre a resposta e usar buffer ou o cabeçalho do tipo de conteúdo não é enviado conforme esperado:

por exemplo.

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

Outras dicas

A partir do seu código parece que você está contando com os mimetypes na biblioteca RDF (você não diz qual). Quando um navegador, como o Firefox / IE (você não diga que você está usando) vê um tipo mime application/ ALGO que normalmente se oferece para salvá-lo, em vez de exibi-lo.

O tipo mime para RDF / XML é application/rdf+xml (eu sei, desde que eu escrevi a especificação) e que fará com que a abordagem save-as. O tipo mime para Turtle (que eu criei em Turtle nota ) não é registrado, mas foi sugerido para ser text/turtle que deve apresentar bem.

Qual é a Content-dispostion set cabeçalho para? Deve ser definido como "inline". Você pode querer tentar defini-lo manualmente para ver se as mudanças de comportamento.

Em nossa família de motores de armazenamento RDF atacarmos este problema, fazendo a negociação de conteúdo.

Isto é, verifique a linha Aceitar nos cabeçalhos de solicitação HTTP, e ajustar nosso comportamento em conformidade. Se a linha Aceitar menciona quaisquer sabores RDF, ou os resultados SPARQL Tipo de Mime explicitamente, então nós enviar de volta o tipo de conteúdo apropriado e resposta associada. Isto serve clientes SPARQL dedicados, código enrolado à mão e vários RDF ferramentas "browser" muito bem em nossa experiência.

Mas para um navegador da Web típico do Aceite linha apenas listas de HTML e alguns formatos de imagem, e nossa HTTP daemon define o tipo de conteúdo para text / plain (ou para uma consulta SPARQL em branco, text / html, com o corpo da resposta sendo uma página web com um formulário para escrever consultas manuais a partir de um navegador da web para testar)

Finalmente, se o cabeçalho Accept está faltando completamente nós sabemos que é uma peça muito ingênuo de software, provavelmente de alguém script Perl ou algo assim, e nós temos um caso especial para que, para tornar a vida das pessoas mais fácil ao desenvolver contra o mecanismo de armazenamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top