كيف يمكنك إرجاع نوع محدد من قبل المستخدم من خدمة WCF؟

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

سؤال

لدي خدمة WCF مستضافة في IIS.القصد من ذلك هو أن يقوم العملاء بإجراء مكالمة واستلام فئة مخصصة تم تعريفها في مشروع/ملف dll آخر.لقد قمت بإنشاء عميل خدمة باستخدام svcutil.exe.تكمن المشكلة في أن هذا العميل الذي تم إنشاؤه تلقائيًا يحتوي على تعريف جزئي/وكيل جديد للفئة التي أحاول إرجاعها من الخدمة.يظهر الآن خطأ تحويل بين فئتي المخصصة الأصلية والتعريف الجزئي الجديد في وقت الترجمة.إذًا كيف يمكنك إرجاع الأنواع المعرفة من قبل المستخدم من خدمة WCF؟نصيحة موضع تقدير.

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

المحلول

فقط إلى الثانية يوسي/ريتش أفكار:

  • نعم، يمكنك إضافة مرجع إلى ملف dll المشترك (بدلاً من استخدام فئة الوكيل التي تم إنشاؤها)
  • نعم، إنه يتعارض مع الكثير من نوايا عقود البيانات، وإذا حدث أي نوع من التسلسل المخصص، فقد تواجه مشكلات في توسيع نطاق خدمتك

لقد سلكت هذا الطريق من قبل، وفي بعض النواحي كنت أتمنى لو لم أفعل ذلك.إعادة التوسعة / التسلسل المخصص - يجب أن تكون كذلك جداً حذر.يكون الأمر أسهل قليلاً إذا كنت تستخدم برنامج تسلسلي مُدلفن مسبقًا مثل شبكة بروتوبوف (والتي يمكن دمجها مباشرة في WCF، والتي تم تصميمها مع أخذ القابلية للتوسعة في الاعتبار)، ولكنها ليست سهلة.

في الواقع، واحد ميزة تتمثل مشاركة الفصول في أنه يجعل الاختبار أسهل قليلاً:منذ أن لديك نفس IFoo في كل مكان، يمكنك أن تسخر من ذلك IFoo مع فرصة معقولة للنجاح.من الصعب الاستهزاء عندما يتدخل الوكيل (حيث تقوم بتغيير المزيد من الأجزاء المتحركة بين رمز الاختبار ورمز الإنتاج).

نصائح أخرى

إذا النوع الذي تريد العودة من لم يتم وضع علامة على أنه DataContract خدمة الدعوة الخاص بك، ثم فلن تكون قادرة على إعادته من WCF دون تقديم نسخة من نفس التجميع لتطبيق العميل.

using System;
using System.ServiceModel;

[ServiceContract]
interface IService
{
    [OperationContract]
    TimeSpan GetTimeSpan();
}

class Service : IService
{
    public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; }
}

وماذا عمل الرمز السابق بعد ذلك؟ إنه يعمل، لأن كلا الجانبين من خدمة الدعوة وSystem.dll حتى كلاهما معرفة نوع System.TimeSpan وهو النوع عودة GetTimeSpan() OperationContract.

وهنا مثال باستخدام DataContract:

using System;
using System.ServiceModel;
using System.Runtime.Serialization;

[ServiceContract]
interface IService
{
    [OperationContract]
    Contract GetContract();
}

[DataContract]
class Contract
{
    [DataMember]
    public String MyProperty { get; set; }
}

class Service : IService
{
    public Contract GetContract() { return new Contract(); }
}
سمات

والآن كنت قد قدمت التسلسل إلى فئة قمت بتعريف (Contract) - وهذا سوف يسمح لك لاستخدام svcutil.exe لخلق الطبقات وكيل في تطبيق العميل الذي سيتم تسلسل وإرسالها إلى خدمة WCF

والآن إذا كنت ترغب في إرجاع النوع الذي ليس DataContract يجب توفير نسخة من التجمع التي تحتوي على هذا النوع من التطبيق العميل.

واحدة من الأشياء التي سوف تحتاج إلى أن يحدث هو أن المستخدم يجب تكوين مرجعية الخدمة لاستخدام أنواع بك من DLL بدلا من الطبقة التي يحددها الوكيل - <وأ href = "http://msdn.microsoft. كوم / EN-US / مكتبة / bb628653.aspx "يختلط =" نوفولو noreferrer "> http://msdn.microsoft.com/en-us/library/bb628653.aspx

ولقد سار في هذا الطريق في الماضي، بل المشكلة هي أنه، بطبيعة الحال، وهذه هي فئتين مختلفتين، لذلك سيكون لديك لاتباع الوصلة التي قدمتهاRich رويتر.

لدينا، على الرغم من تعلم بالطريقة الصعبة لماذا هذا هو ممارسة سيئة لأنه غني امام نظيره تينيت 3RD من SOA- "مخطط حصة الخدمات والعقود، وليس الطبقة".

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

في المشاريع الكبيرة هذا سرعان ما يصبح عبئا صيانة ضخمة.

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