نانسيفس كونيغ العودة 406 من إيريسبونسبروسور باستثناء النص / هتمل نوع المحتوى

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

سؤال

أنا تشغيل نانسي على مايكروسوفت.أوين.المضيف.إيس (هيليوس).

أحاول توصيل كونيج عبر IResponseProcessor للرد على Accept رأس text/plain, ، لكنه سيعود فقط 406.

لقد جربت أنواعا متعددة من المحتوى ، ولا شيء يعمل....إلا ، الغريب, text/html (بعد مسح القاعدة ViewProcessor).

public class ViewApiProcessor : IResponseProcessor
{
    private readonly IViewFactory viewFactory;

    public ViewApiProcessor(IViewFactory _viewFactory)
    {
        this.viewFactory = _viewFactory;
    }

    private static readonly IEnumerable<Tuple<string, MediaRange>> extensionMappings =
    new[] { new Tuple<string, MediaRange>("txt", MediaRange.FromString("text/plain")) };

    public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings
    {
        get { return extensionMappings; }
    }

    public ProcessorMatch CanProcess(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {

        bool matchingContentType =
            requestedMediaRange.Matches("text/plain");

        return matchingContentType
            ? new ProcessorMatch { ModelResult = MatchResult.DontCare, RequestedContentTypeResult = MatchResult.ExactMatch }
            : new ProcessorMatch();
    }

    public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        context.ViewBag.RequestType = "api";

        var response = (Response)this.viewFactory.RenderView(context.NegotiationContext.ViewName, model, GetViewLocationContext(context));

        return response.WithContentType("text/plain");
    }

    private static ViewLocationContext GetViewLocationContext(NancyContext context)
    {
        return new ViewLocationContext
        {
            Context = context,
            ModuleName = context.NegotiationContext.ModuleName,
            ModulePath = context.NegotiationContext.ModulePath
        };
    }
}

ثم ، في الوحدة:

Get["/"] = p => 
{
    return Negotiate.WithView("Index");
};

تحديث: لقد قمت بتحرير الكود أعلاه لإظهار التركيبة المناسبة من IResponseProcessor و Negotiator

مصدر جيثب

هل كانت مفيدة؟

المحلول

الشيء الأكثر إثارة للاهتمام هنا هو, ماذا تبدو الطرق الخاصة بك مثل?إذا كنت تريد أن تكون قادرة على التفاوض على الاستجابة ثم تحتاج إلى العودة " مفاوض`

Get["/"] = _ => {
   return Negotiator.WithModel(...).WithView("foo");
};

إذا قمت بإرجاع سهل Response (أو أي شيء يمكن أن يلقي ضمنيا إلى استجابة ، مثل سلسلة ، إنت، هتبستاتوسكود أو العمل) ثم سوف التحايل على التفاوض المحتوى تماما كما هو موضح هنا https://github.com/NancyFx/Nancy/wiki/Content-Negotiation.

إذا كنت تعود وجهة نظر ، وذلك باستخدام View[..] ثم أنت تقول أن نطاق الوسائط المسموح به الوحيد هو text/html

نصائح أخرى

كونيغ هو حل يبحث عن مشكلة:

التفاوض المحتوى المتشعب أربعة محاور:التفاوض بالتنسيق (قبول) ، والتفاوض بترميز الأحرف (قبول-مجموعة الأحرف) ، والتفاوض باللغة الطبيعية (قبول-لغة) والتفاوض بالضغط (قبول-ترميز).يجب مناقشة هذه المحاور بشكل منفصل.

  • التفاوض حسب الشكل (قبول)

لا يمكنك الاعتماد على التفاوض على التنسيق كمؤلف ويب ، لأن هناك دائما عملاء يقبلون شيئا لا يعلنون عنه.نظرا للنقطة السابقة ، إذا كنت بائعا للمتصفح وشحن بائع آخر متصفحا لا يعلن أنه يدعم شيئا يدعمه ، فليس من المنطقي بالنسبة لك أن تضيع وحدات البايت التي تعلن ذلك ، إما ، لأن مؤلفي الويب لا يمكنهم الاعتماد (فقط) على الإعلان على أي حال.

  • التفاوض عن طريق ترميز الأحرف (قبول-محارف)

من المتصفحات الرئيسية ، فقط كروم يرسل قبول محارف بعد الآن

  • التفاوض باللغة الطبيعية (قبول اللغة)

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

  • التفاوض عن طريق الضغط (قبول الترميز)

في هذه الأيام ، تدعم جميع المتصفحات الرئيسية الردود المضغوطة.بهذا المعنى ، فإن الميزة ناجحة.ومع ذلك ، فمن الإسراف بشكل رهيب أن ينتهي كل طلب يحتوي على 23 بايت من النمطي.

المراجع

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