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

时间:2009-06-26 14:09:52

标签: asp.net content-type mime-types rdf sparql

我的浏览器无法识别我在回复中发送的内容类型并尝试下载文件而不是显示文件时出现问题。

我有一个用ASP.Net编写的通用处理程序(名为SPARQL.ashx),它可以完成一些工作并生成一个有两种可能类型的对象。它获取SPARQLResultSet或Graph,然后在使用适当的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类型。或者这是一个问题,我正在使用Generic Handler?或者有没有人有任何其他想法为什么会发生这种情况?

修改

为了清晰起见,添加了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.
}

4 个答案:

答案 0 :(得分:2)

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

RDF / XML的mime类型是application/rdf+xml(我知道,因为我编写了规范),这将导致save-as方法。 Turtle的mime类型(我在Turtle note中创建的)没有注册,但建议text/turtle显示正常。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

最后发现问题的根源,似乎你必须在响应上调用Clear()并使用Buffering或内容类型标头没有按预期发送:

例如

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