0

ブラウザが応答で送信しているコンテンツタイプを認識できず、ファイルを表示せずにダウンロードしようとしているという問題があります。

ASP.Netで記述された汎用ハンドラー(SPARQL.ashxという名前)があります。これは、いくつかの作業を実行し、2つの可能なタイプのオブジェクトを生成します。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ベースで、もう一方の形式がプレーンテキストベースであるにもかかわらず、結果を表示するのではなくダウンロードするようにブラウザが頻繁に要求することです。したがって、どちらも最新のブラウザで表示できるはずです。

動作はブラウザごとに異なり、結果の形式に関係なくダウンロードを求めるプロンプトが表示されるものもあれば、一方の形式ではなく他方の形式でダウンロードを要求するものもあります。

正しいMIMEタイプが送信されるように、IISを何らかの方法で構成する必要がありますか。記録として、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/SOMETHINGを表示すると、通常、表示するのではなく保存するように提案されます。

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

私たちの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 に答える
0

最後に問題の原因が見つかりました。応答でClear()を呼び出してバッファリングを使用する必要があるようです。そうしないと、コンテンツタイプヘッダーが期待どおりに送信されません。

例えば。

//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 に答える