سؤال

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

للحصول على الأشياء واضحة أنا وضعت خدمة صغيرة لاختبار الغرض الذي لديه طريقة واحدة و يعتمد على خارجي .صافي dll الذي يعرض صنف واحد.عقد الخدمات البرمجية

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }

حيث actionType,calculationType,action هي enums أعلن داخل dll الخارجية و DataSeries هي فئة أعلن داخل dll.

على origianl الإشكاليات من أجل DataSeries فئة في dll تميزت [Serializable] فقط و لا [DataMember] على أعضائها.

أنا باستخدام 3 dll على العميل والخادم الجانب ، كانت دهشتي كل التطبيقات تعمل بشكل جيد دون وضع [DataContract] على DataSeries فئة دون استخدام أي من [EnumMember] داخل enums, [DataMember] داخل الصف.

لذا ما الذي يجري ؟

تجربة أخرى:

إزالة 3rd الطرف من جانب العميل باستخدام الخدمة كما هو وجدت أن vs2008 يولد enums ، DataSeries فئة ماركس لهم السليم السمات ؟ مثل

    [System.CodeDom.Compiler.GeneratedCodeAttribute      ("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType",  Namespace="http://schemas.datacontract.org/2004/07/DBInterface")]
    public enum actionType : int {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Buy = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sell = 2,
    }
هل كانت مفيدة؟

المحلول

DataContract ، <أ href ل = "http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx" يختلط = "نوفولو noreferrer"> DataMember و <لأ href = "HTTP: // msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute.aspx "يختلط =" نوفولو noreferrer "> تستخدم سمات EnumMember التي كتبها في DataContractSerializer (وعادة <لأ href =" http://msdn.microsoft.com/en -US / مكتبة / system.servicemodel.basichttpbinding.aspx "يختلط =" نوفولو noreferrer "> basicHttpBinding أو <وأ href =" http://msdn.microsoft.com/en-us/library/system.servicemodel .wshttpbinding.aspx "يختلط =" نوفولو noreferrer "> wsHttpBinding ). إذا كنت تعريض نقطة النهاية مع TCP ملزمة ( netTcpBinding ) فقط SerializableAttribute هو مطلوب. لاحظ أنه مع DataContractSerializer هل يمكن فقط إضافة SerializableAttribute إلى الفصول الدراسية، وسوف تسلسل كافة الحقول تلقائيا.

وأنصح لك ما يلي: إذا كنت تريد خدمة الخاص بك لتكون قابلة للتشغيل المتبادل، واستخدام basicHttpBinding وعلامة الفصول الدراسية مع DataContract وDataMember الصفات. إذا كان العميل الخاص بك هو تطبيق .NET، استخدام netTcpBinding وعلامة الفصول الدراسية مع SerializableAttribute.

ويمكنك أيضا قراءة هذه آخر للحصول على المقارنة بين الارتباطات المختلفة.

نصائح أخرى

ولكن من دون استخدام DataContract أو أي سمات وجدت جانب العميل يعمل بشكل صحيح

نعم, هذا صحيح - إذا كانت أنواع البيانات التي تستخدمها ليست ملحوظ مع [DataContract], WCF محاولة استخدام الافتراضي الصابون مسلسل على مجرد تسلسل كل شيء هذا العام (جميع الممتلكات العامة).

وهي تعمل - ولكن قد لا يكون ما تريد / تتوقع - لذلك أود الثانية دارين الرأي - فقط دائما استخدام صريحة [DataContract] الصفات على أنواع.أوضح وجعل لكم نية نفسك (أو غيرها من المبرمجين الذين يحتاجون للحفاظ على الرمز الخاص بك في وقت لاحق) ، كان ذلك أفضل.هذه "الخدع السحرية" التي تحدث خلف الكواليس تميل إلى أن تسبب الارتباك في بعض الأحيان - أنت أفضل حالا لا الاعتماد عليها كثيرا

مارك

وهكذا بالنسبة لي أنا استخدم [DataContract] الصورة، وتمرير معلمة واحدة في، والعودة عقدا البيانات مرة أخرى.

وهذا يعطي مرونة أكثر، كما يمكن تمديد عقد بيانات مع، سمات اختيارية جديدة لعقد البيانات، دون كسر أي العملاء الحاليين.

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

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")]
public enum GenderEnum
{
    [EnumMember()]
    Unknown = 0,
    [EnumMember()]
    Male = 1,
    [EnumMember()]
    Female = 2
}

ويجب بعد ذلك بمناسبة عقد خدمات مع

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top