Navegador não reconhece cabeçalho tipo de conteúdo corretamente
-
20-08-2019 - |
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.
}
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.