浏览器无法正确识别内容类型标题

问题描述:

我的浏览器出现问题,无法识别我在响应中发送的内容类型,并尝试下载文件而不是显示它。浏览器无法正确识别内容类型标题

我有一个通用的处理程序(名为SPARQL.ashx)写在ASP.Net中,它做了一些工作,并产生了两种可能类型的对象。它可以获得SPARQLResultSet或图形,然后在使用适当的Save方法将内容发送给用户之前设置适当的内容类型。代码片段如下:

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

我的问题是,我的浏览器通常会提示下载结果,而不是尽管一个格式基于XML和基于其他纯文本显示它们,因此都应该显示在任何现代浏览器中。

行为因浏览器而异,有些会提示下载,无论结果格式如何,有些会为一个而不是另一个。

我可能需要以某种方式配置IIS以确保发送正确的MIME类型。为了记录,我有在IIS中注册的官方文件扩展名和MIME类型。或者这是我使用通用处理程序的问题?还是有人有任何其他想法,为什么这可能会发生?

编辑

增加从MIMETypesHelper类代码为清楚起见

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

发布从您的服务返回的确切HTTP标头可能会有帮助。在Fiddler(www.fiddler2.com)中,只需右键单击该会话,然后选择复制>标题。 – EricLaw 2009-06-29 21:42:50

终于找到了问题的根源,似乎你必须调用的响应清除(),并使用缓冲或内容类型标题不会发送预期:

如。

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

什么的Content-Dispostion头设置?它应该设置为“内联”。您可能需要尝试手动设置以查看行为是否发生变化。

从你的代码看来,你依赖于rdf库中的mimetypes(你不会说哪一个)。当浏览器如firefox/IE(你不会说你正在使用哪一种)看到一个MIME类型application/SOMETHING它通常提供保存它而不是查看它。

RDF/XML的MIME类型是application/rdf+xml(我知道,因为我写了规范),这将导致保存方式。龟的MIME类型(我在Turtle note中创建)未注册,但建议为text/turtle,应显示正常。

+0

该库被称为dotNetRDF,它是我自己的RDF实现(仍然是alpha版本前的版本),所以我非常熟悉你所包含的所有RDF规范。 MIME类型助手类有一组数组,其中包含用于不同RDF语法的公认MIME类型,两个数组中的第一项(代码中引用)是该语法的最标准类型。 行为因浏览器和个人电脑而异,我开发机器上的FF显示SPARQL结果,但在家用机器同时显示两者时下载海龟。 IE/Chrome/Safari在行为上都表现出类似的不一致。 – RobV 2009-06-29 20:21:27

+0

我不确定这是否有一个很好的答案,但@tvanfosson有另一个有用的建议 - 内容处置http://www.ietf.org/rfc/rfc2183.txt我似乎记得IE浏览器可能会使用。 – dajobe 2009-07-03 00:41:30

在我们的RDF存储引擎系列中,我们通过内容协商来解决这个问题。

也就是说,我们检查HTTP请求标头中的Accept行,并相应地调整我们的行为。如果Accept行显式提及任何RDF风格或SPARQL结果MIME类型,那么我们会发回适当的Content-type和相关联的响应。这为我们的体验提供了专用的SPARQL客户端,手动代码和各种RDF“浏览器”工具。

但是对于典型的Web浏览器,Accept行只是列出了HTML和一些图像格式,而我们的HTTP守护程序将Content-type设置为text/plain(或者对于空白SPARQL查询,text/html, body是一个网页,带有一个表单,用于编写用于测试的Web浏览器的手动查询)

最后,如果Accept标题完全丢失,我们知道这是一个非常天真的软件,很可能是某人的Perl脚本或其他东西,我们有一个特殊的例子可以让人们在与存储引擎进行开发时更轻松。