0

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

我有一个用 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 类型。或者这是我使用通用处理程序的问题?或者有没有人有任何其他想法为什么会发生这种情况?

编辑

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

4 回答 4

2

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

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

于 2009-06-27T03:27:52.793 回答
1

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

于 2009-06-26T14:23:48.597 回答
0

终于找到了问题的根源,似乎您必须在响应上调用 Clear() 并使用 Buffering 或 Content Type 标头未按预期发送:

例如。

//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));
于 2009-07-13T08:19:43.553 回答
0

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

也就是说,我们检查 HTTP 请求标头中的 Accept 行,并相应地调整我们的行为。如果 Accept 行明确提及任何 RDF 风格,或 SPARQL 结果 MIME 类型,那么我们将发回适当的 Content-type 和相关响应。根据我们的经验,这很好地服务于专用的 SPARQL 客户端、手动代码和各种 RDF“浏览器”工具。

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

最后,如果 Accept 标头完全丢失,我们知道它是一个非常幼稚的软件,很可能是某人的 Perl 脚本或其他东西,我们有一个特殊情况,可以让人们在针对存储引擎进行开发时更轻松。

于 2009-06-29T21:34:35.297 回答