سؤال

لدي عقد الخدمة الذي يحدد طريقة مع معلمة من نوع النظام.وجوه (xs:anyType في WSDL).كنت تريد أن تكون قادرة على تمرير أنواع بسيطة وكذلك أنواع معقدة في هذه المعلمة.أنواع بسيطة تعمل بشكل جيد, ولكن عندما كنت في محاولة لتمرير نوع معقد يتم تعريفه في WSDL ، أحصل على هذا الخطأ:

عنصر 'http://tempuri.org/:value'يحتوي على بيانات 'http://schemas.datacontract.org/2004/07/MyNamespace:MyClass بيانات العقد.على deserializer لديه أي معرفة من أي نوع الخرائط على هذا العقد.إضافة نوع المقابلة 'MyClass' إلى قائمة أنواع معروفة - على سبيل المثال ، عن طريق استخدام KnownTypeAttribute السمة أو عن طريق إضافته إلى قائمة أنواع معروفة تمريرها إلى DataContractSerializer.

مضيفا أنها نوع معروف لا يساعد لأنها بالفعل في WSDL.كيف يمكنني تمرير كائن من نوع معقد عبر "xs:anyType" المعلمة ؟

مزيد من المعلومات:

وأعتقد أن هذا يعمل عند استخدام NetDataContract, ولكن أنا لا يمكن استخدام ذلك لأن موكلي سيلفرلايت.

لقد رأيت إشارات إلى أنواع معقدة صراحة تمديد xs:anyType, ولكن ليس لدي أي فكرة عن كيفية جعل WCF توليد WSDL أن يفعل ذلك, وليس لدي أي فكرة ما إذا كان أو لم يكن من شأنه أن يساعد حتى.

شكرا

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

المحلول 3

لقد حل هذه المشكلة باستخدام ServiceKnownType السمة.أنا ببساطة إضافة بلدي نوع معقد كخدمة النوع المعروف على عقد خدمة الخطأ يذهب بعيدا.لست متأكدا لماذا لم يكن هذا العمل آخر مرة حاولت ذلك.

لا يبدو أن تؤثر على WSDL بأي طريقة حتى وأظن أن تسلسل تيار يجب أن يكون هناك بعض الاختلاف الذي يبلغ deserializer هذا الكائن يمكن إلغاء تسلسل باستخدام نوع بي.

نصائح أخرى

على NetDataContract يعمل لأن NetDataContractSerializer يتضمن نوع المعلومات.

على KnownType السمة يرشد DataContractSerializer كيفية إلغاء تسلسل الرسالة.يجري تنفيذ محددة ، وهذا هو معلومات أكثر و فوق هذا تعريف الجمهور العقد لا تنتمي في WSDL.

أنت لن تكون قادرة على تمرير أي عمرها نوع البيانات لأن deserializer يحتاج إلى تحديد النوع المناسب إنشاء مثيل.

كنت قد تكون قادرة على استخلاص الخاص بك أنواع معروفة في وقت التشغيل بدلا من القرص الثابت تلوينها في DataContract.نلقي نظرة هنا للحصول على عينة.

آمل أن يكون هذا سوف يساعد.رأيت زميل لي باستخدام هذا الرمز إلى إرسال معقدة أنواع البيانات و بالنسبة لي هذا هو بسيط جدا.هذا كان يستخدم مع basicHttpBinding وأنه يعمل بشكل جيد جدا مع موس BDC فضلا عن التطبيقات الأخرى التي تستخدم الأساسية ملزمة.

  1. إنشاء قاعدة بيانات العقد استنادا إلى فئة عامة
  2. استخدام البيانات العقد عندما يلزم أن تكون المعلومات المرسلة

    [DataContract(Namespace = "http://Service.DataContracts"اسم = "ServiceDataContractBase")] الطبقة العامة ServiceDataContract {

    public ServiceDataContract() { }
    
    public ServiceDataContract(TValueType Value)
    {
        this.m_objValue = Value;
    }
    
    private TValueType m_objValue;
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)]
    public TValueType Value
    {
        get { return m_objValue; }
        set { m_objValue = value; }
    }
    

    }

استخدام هذه البيانات العقد أي وقت مضى حيث أنه مطلوب في WCF وظائف عودة معقدة نوع البيانات.على سبيل المثال:

public ServiceDataContract<string[]> GetStrings()
{
    string[] temp = new string[10];
    return new ServiceDataContract<string[]>(temp);
}

تحديث:ServiceDataContract هي فئة عامة يستخدم TValueType.فمن لا تظهر بسبب شيء خاطئ مع طريقة عرض HTML.

حاول استخدام البيانات العقد بدلاء إلى خريطة معتمد كائن دوت نت محددة أو غير قابلة للتشغيل المتبادل أنواع.انظر MSDN

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

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

إذا كنت تمديد آخر نوع معقد, يبدو لي أن كنت ترغب في إضافة KnownType ينسب إلى ذلك النوع الأساسي.ولكن منذ النوع الأساسي هو كائن, أنا لا أرى أي طريقة للقيام بذلك.

أما عن البدائل ، يبدو لي أن هذه هي تستخدم لتغليف أنواع أن لا يكون العقد محدد.في حالتي ولكن لدي عقد محدد.

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