لماذا نحصل على "خطأ في تأطير" WCF على بعض الآلات ولكن ليس غيرها

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

سؤال

لقد وجدنا للتو أننا نحصل على "أخطاء تأطير"(كما ذكرت سجلات WCF) عند تشغيل نظامنا على جهاز اختبار العملاء.

كل شيء يعمل بشكل جيد على آلات التطوير لدينا.

لدينا فئة قاعدة مجردة ، مع سمات معروفة لجميع فصولها الفرعية. واحدة من الفئة الفرعية في عداد المفقودين سمة DataContract.

ومع ذلك ، كل شيء عمل على آلة الاختبار الخاصة بنا!

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

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


الكود الذي يحاول إظهار ما أتحدث عنه ، (وليس الرمز الحقيقي)

    [DataContract()]
    [KnownType(typeof(SubClass1))]
    [KnownType(typeof(SubClass2))] 
    // other subclasses with data members
    public abstract class Base
    {
        [DataMember]
        public int LotsMoreItemsThenThisInRealLife;
    }

    /// <summary>
    /// This works on some machines (not not others) when passed to Contract::DoIt, 
    /// note the missing [DataContract()]
    /// </summary>
    public class SubClass1 : Base
    {
        // has no data members
    }

    /// <summary>
    /// This works in all cases when passed to Contract::DoIt
    /// </summary>
    [DataContract()]
    public class SubClass2 : Base
    {
        // has no data members
    }

    public interface IContract
    {
        void DoIt(Base[] items);
    }

    public static class MyProgram
    {
        public static IContract ConntectToServerOverWCF()
        {
            // lots of code ...
            return null;
        }

        public static void Startup()
        {
            IContract server = ConntectToServerOverWCF();

            // this works all of the time
            server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});

            // this works "in develperment" e.g. on our machines, but not on the customer's test machines! 
            server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
        }
    }

تحديث لقد قيل لي .NET 3.5 SP1 قيد التشغيل الكل الآلات ، بعد أن أؤكد هذا بنفسي.

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

المحلول 2

أعتقد أن المشكلة هي أن بعض الجهاز لم يكن لديه 3.5 SP1 عليهم.

نصائح أخرى

لقد واجهنا مشكلة مماثلة: كان ملفًا بشكل صحيح تعاقد البيانات على جميع آلات الاختبار الخاصة بنا. ومع ذلك ، على جهاز عميل معين ، فشلت في الخطأ

classname لا يمكن التسلسل. النظر في وضع علامة مع DataContractAttribute تنسب ، ووضع علامة على جميع أعضائها الذين تريدهم التسلسلية مع DataMemberAttribute ينسب.

تبين أن Cusotmer كان يعمل .NET Framework 3.0 ، في حين تم إجراء جميع اختباراتنا على .NET Framework 3.5 SP1.

يبدو أن سلوك Serializer عقد البيانات هو مختلف الترتيب .NET Framework 3.0 و .NET Framework 3.5. في 3.5 ، إذا كان الفصل هو XML قابل للتسلسل ، فإنه يمكن التسلسل تلقائيًا عقد بيانات البيانات أيضًا. ومع ذلك ، ليس هذا هو الحال مع .NET Framework 3.0 - يجب تزيين الفصل [DataContract] أو [Serializable].

أتمنى أن يساعدك هذا!

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