Браузер не может правильно распознать заголовок типа контента

StackOverflow https://stackoverflow.com/questions/1049355

Вопрос

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

У меня есть универсальный обработчик (с именем 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

Наконец-то найден источник проблемы, похоже, вам нужно вызвать 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));

Другие советы

Судя по вашему коду, вы полагаетесь на mimetypes в библиотеке rdf (вы не говорите, какой именно).Когда браузер, такой как Firefox/IE (вы не говорите, какой вы используете), видит тип mime application/ЧТО-НИБУДЬ обычно он предлагает сохранить его, а не просмотреть.

Тип MIME для RDF/XML: application/rdf+xml (Я знаю, так как я написал спецификацию), и это приведет к подходу «сохранить как».Тип пантомимы для Черепахи (который я создал в Черепашья нота) не зарегистрирован, но было предложено быть text/turtle который должен отображаться нормально.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top