Браузер не может правильно распознать заголовок типа контента - PullRequest
0 голосов
/ 26 июня 2009

У меня проблема с тем, что мой браузер не может распознать типы контента, которые я отправляю в своих ответах, и пытаюсь загрузить файл вместо его отображения.

У меня есть общий обработчик (названный SPARQL.ashx), написанный на ASP.Net, который выполняет некоторую работу и создает объект, который имеет два возможных типа. Либо он получает 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. Для записи у меня есть официальные расширения файлов и типы MIME, зарегистрированные в IIS. Или это проблема с тем фактом, что я использую универсальный обработчик? Или у кого-нибудь есть другие идеи, почему это может происходить?

Редактировать

Добавлен код из класса 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 ]

2 голосов
/ 27 июня 2009

Из вашего кода похоже, что вы полагаетесь на mimetypes в библиотеке rdf (вы не говорите, какой именно). Когда браузер, такой как firefox / IE (вы не говорите, который вы используете), видит тип mime application/ SOMETHING , он обычно предлагает сохранить его, а не просмотреть.

Тип MIME для RDF / XML - application/rdf+xml (я знаю, так как я написал спецификацию), и это вызовет подход сохранения как. Тип пантомимы для Turtle (который я создал в Turtle note ) не зарегистрирован, но было предложено иметь значение text/turtle, которое должно отображаться нормально.

1 голос
/ 26 июня 2009

Для чего установлен заголовок Content-Dispostion ? Он должен быть установлен на «встроенный». Возможно, вы захотите попробовать установить его вручную, чтобы увидеть, изменится ли поведение.

0 голосов
/ 13 июля 2009

Наконец, обнаружен источник проблемы, кажется, вам нужно вызвать 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));
0 голосов
/ 30 июня 2009

В нашем семействе хранилищ RDF мы решаем эту проблему путем согласования содержимого.

То есть мы проверяем строку Accept в заголовках HTTP-запроса и соответствующим образом корректируем свое поведение. Если в строке Accept упоминаются какие-либо разновидности RDF или в явном виде MIME-тип SPARQL, то мы отправляем обратно соответствующий тип Content и связанный с ним ответ. Это очень хорошо подходит для наших клиентов SPARQL, свернутого вручную кода и различных инструментов RDF-браузеров.

Но для типичного веб-браузера строка Accept просто перечисляет HTML и несколько форматов изображений, а наш HTTP-демон устанавливает Content-type на text / plain (или для пустого запроса SPARQL, text / html, с телом ответа). веб-страница с формой для написания запросов вручную из веб-браузера для тестирования)

Наконец, если заголовок Accept отсутствует вообще, мы знаем, что это очень наивная часть программного обеспечения, скорее всего, чей-то скрипт Perl или что-то в этом роде, и у нас есть особый случай, чтобы облегчить жизнь людям при разработке с использованием механизма хранения.

...