استبدال النظام القديم & إنشاء رمز الملقم باستخدام ServiceStack + مخصص التسلسل

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

  •  13-12-2019
  •  | 
  •  

سؤال

لدينا تراث خادم البرمجية التي نريد التخلي عن وضع واحدة جديدة باستخدام ServiceStack.العملاء الحاليين ليسوا مكتوب في .صافي.نحن لا تخطط لاستخدام .صافي على جانب العميل على الإطلاق.

البيانات بين العميل والخادم يجري تبادلها باستخدام XML و JSON - في هذه اللحظة سلمان هو فقط العودة تنسيق الاستجابة (فقط بعض الخدمات المتاحة).تنسيق XML كان يعرف عند أول نسخة من الخادم الحل تم إنشاؤه منذ عدة سنوات.نحن لا نريد تغييره.

كيف نستخدم ServiceStack لبناء راحة webservices ، من شأنها أن تسلسل إلغاء تسلسل البيانات إلى تنسيق التي تم تصميمها في الماضي (يرجى ملاحظة أن العملاء لن يكون مكتوب في C#/.Net).نحن بحاجة إلى ريموت كلا من:التسلسل & إلغاء التسلسل.هو أن من الممكن استخدام DTOs والتي لا تزال السيطرة على هذه الكائنات تسلسل / إلغاء تسلسل ؟

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

المحلول

إضافة منطق مخصص عن طريق طلب / الاستجابة المرشحات

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

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

base.RegisterRequestBinder<MyRequest>(httpReq => ... requestDto);

هذا يتيح لك الوصول إلى IHttpRequest موضوع يتيح لك إضافة مخصص إلغاء التسلسل المنطق نفسك.الخيار الآخر هو أن أقول ServiceStack إلى عدم محاولة إلغاء تسلسل الطلب نفسه بدلا من حقن HttpRequest InputStream حتى تتمكن من إلغاء تسلسل الطلب نفسك:

public class Hello : IRequiresRequestStream {
    Stream RequestStream { get; set; }
}

كل هذه الأمثلة هي شرح على ServiceStack هو التسلسل والتسلسل دي صفحة ويكي.

تسجيل المخصصة الخاصة نوع وسائل الإعلام

خيار آخر يكون قادرا على العودة القوية كتبته DTOs ولكن التغيير الناتج عن طلبات معينة يمكن أن يتم عن طريق إضافة جديدة مخصصة نوع الوسائط كما هو موضح في Northwind بصيغة بطاقة مخصصة نوع الوسائط سبيل المثال, ه.g:

public static void Register(IAppHost appHost)
{
    appHost.ContentTypeFilters.Register( "text/x-vcard", SerializeToStream,  DeserializeFromStream);
}

...    

public static void SerializeToStream(IRequestContext requestContext, object response, Stream stream)
{
    var customerDetailsResponse = response as CustomerDetailsResponse;
    using (var sw = new StreamWriter(stream))
    {
        if (customerDetailsResponse != null)
        {
            WriteCustomer(sw, customerDetailsResponse.Customer);
        }
        var customers = response as CustomersResponse;
        if (customers != null)
        {
            customers.Customers.ForEach(x => WriteCustomer(sw, x));
        }
    }
}

هذا هو خيار جيد إذا كنت يمكن تحميل XML مخصصة الردود تحت نوع محتوى مختلف ، مثل تطبيق/v-xml حتى لا تتعارض مع القائمة تنسيق XML/نقطة النهاية.باستخدام ContentType فوق HTTP العميل يمكن أن نطلق على هذا العرف التنفيذ مع ?تنسيق=v-xml أو باستخدام رأس HTTP: قبول:تطبيق/v-xml.

إذا كنت تريد تجاوز المدمج في XML ContentType كنت لا تزال لا يمكن ولكن أوصي الوقوع مرة أخرى إلى الأصل XmlSerializer تنفيذ SerializeStream و DeserializeStream أساليب لو انها ليست واحدة من صيغ إرث لديك إلى الدعم.

عن طريق تمرير ServiceStack وتنفيذ باستخدام المخصصة الخاصة بك IHttpHandler

وثمة خيار آخر هو طريق تمرير ServiceStack تماما وبدلا من معالجة الطلب الخاص بك مخصص IHttpRequest معالج عن طريق تسجيله في ServiceStack التكوين في AppHost:

 SetConfig(new EndpointHostConfig { 
    RawHttpHandlers = {
      httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null 
    }
 });

العودة غير فارغة (أيأي معالج) يمر ServiceStack.

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