سؤال

أواجه مشكلة تتعلق بفشل المتصفح في التعرف على أنواع المحتوى التي أرسلها في ردودي وأحاول تنزيل الملف بدلاً من عرضه.

لدي معالج عام (يُسمى SPARQL.ashx) مكتوب بلغة ASP.Net والذي يقوم ببعض الأعمال وينتج كائنًا من نوعين محتملين.إما أن تحصل على SPARQLResultSet أو Graph ثم تقوم بتعيين نوع المحتوى المناسب قبل استخدام طريقة الحفظ المناسبة لإرسال المحتوى إلى المستخدم.جزء الكود أدناه:

  //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() عند الاستجابة واستخدام 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));

نصائح أخرى

من التعليمات البرمجية الخاصة بك يبدو أنك تعتمد على أنواع mimetypes الموجودة في مكتبة rdf (لا تذكر أي منها).عندما يرى متصفح مثل Firefox / IE (لا تذكر المتصفح الذي تستخدمه) نوع mime application/شئ ما يعرض عادةً حفظه بدلاً من مشاهدته.

نوع mime لـ RDF/XML هو application/rdf+xml (أعلم ذلك، منذ أن كتبت المواصفات) وهذا سيؤدي إلى اتباع نهج الحفظ باسم.نوع التمثيل الصامت لـ Turtle (الذي قمت بإنشائه فيه مذكرة السلحفاة) غير مسجل ولكن تم اقتراح أن يكون text/turtle والتي يجب أن تظهر بشكل جيد.

ما هو التخلص من المحتوى تعيين رأس ل؟يجب ضبطه على "مضمن".قد ترغب في محاولة تعيينه يدويًا لمعرفة ما إذا كان السلوك قد تغير.

في عائلتنا من محركات التخزين RDF، نقوم بمواجهة هذه المشكلة من خلال التفاوض على المحتوى.

وهذا يعني أننا نتحقق من سطر القبول في رؤوس طلبات HTTP، ونضبط سلوكنا وفقًا لذلك.إذا ذكر سطر القبول أي نكهات RDF، أو إذا كان SPARQL ينتج نوع MIME بشكل صريح، فإننا نرسل مرة أخرى نوع المحتوى المناسب والاستجابة المرتبطة به.يخدم هذا عملاء SPARQL المخصصين والأكواد المدرفلة يدويًا وأدوات "متصفح" RDF المتنوعة بشكل جيد جدًا في تجربتنا.

ولكن بالنسبة لمتصفح الويب النموذجي، فإن سطر القبول يسرد فقط HTML وبعض تنسيقات الصور، ويقوم برنامج HTTP الخاص بنا بتعيين نوع المحتوى إلى نص/عادي (أو لاستعلام SPARQL فارغ، نص/html، مع كون نص الاستجابة عبارة عن ويب صفحة بها نموذج لكتابة الاستعلامات اليدوية من متصفح الويب للاختبار)

أخيرًا، إذا كان رأس القبول مفقودًا تمامًا، فنحن نعلم أنه برنامج ساذج جدًا، على الأرجح نص Perl خاص بشخص ما أو شيء من هذا القبيل، ولدينا حالة خاصة لذلك لجعل حياة الأشخاص أسهل عند التطوير مقابل محرك التخزين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top