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

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

سؤال

لكل مشاركتي الأخرى حول قيم إرجاع خدمة WCF, ، أنا أستهلك خدمة ويب من شركة أخرى، وعندما أقوم بإضافة مرجع الخدمة داخل Visual Studio، فإن القيمة المرجعة للطريقة هي كائن من النوع object.

لقد أظهر لي مؤلف خدمة الويب الكود، وهو في الواقع يُرجع كائنًا مكتوبًا.

هل أفتقد شيئًا ما، أم أن فئة الوكيل من المفترض أن تُرجع قيمة مكتوبة؟

هل هناك إعداد لإنشاء فئة الوكيل أو الخدمة الفعلية؟

تحديث:

لقد نظرت إلى الفئات الفعلية وراء خدمة WCF وأدركت أن القيمة المرجعة لطريقة الخدمة تُرجع بالفعل ملفًا واجهه المستخدم, ، الذي ينفذه النوع الخرساني.يتم تمييز النوع المحدد بالسمة [DataContract] (والسمات المناسبة [DataMember])، لكن الواجهة لا تحتوي على مثل هذه السمات.هل يمكن أن يتسبب هذا في قيام الخدمة بتعيين نوع الإرجاع ككائن؟

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

المحلول

من الناحية الافتراضية، إذا كنت مطور الخدمة، فيمكنك استخدام ملف KnownTypeAttribute:

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

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

ربما يكون رمز الخدمة هو الذي يقوم بذلك بالفعل، والمشكلة تكمن في svcutil.exe عدم إنشاء فئات الوكيل بدقة كافية.

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

نصائح أخرى

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

أداة Visual Studio "إضافة مرجع الخدمة" و svcutil.exe جيدة جدًا في إنشاء فئات الوكيل ولكنها ليست مثالية.الملفات التي ينشئونها هي ملكك لتعديلها وأشجعك على تعديل العملية ببساطة لإعادة عقد البيانات المناسب.

واجهنا مشكلة مماثلة عند استخدام خدمة ويب Java من WCF.

في حالتنا، كان النوع الذي ذكر أنه تم إرجاعه عبارة عن نسخة محدودة مما تم إرجاعه بالفعل.

ما نجح بالنسبة لنا هو صب الكائن بالنوع المتوقع.وبعد ذلك أصبحت البيانات متاحة.

لذلك، لإصلاح مشكلتك، يمكنك محاولة تحويل الكائن إلى النوع المتوقع.

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