سؤال

أحاول أن أستهلك شبكة WCF باستخدام إمكانيات RPC من Protobuf-Net. إليك عقد الخدمة الخاص بي:

namespace WcfEchoService
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IEchoService
    {

        [OperationContract, ProtoBehavior]
        string Echo(string value);

        [OperationContract, ProtoBehavior]
        string EchoNull();

        [OperationContract, ProtoBehavior]
        CompositeType[] EchoData(CompositeType[] value);
    }


    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    [ProtoContract]
    public class CompositeType
    {


        [ProtoMember(1)]
        public bool BoolValue
        {
            get;
            set;
        }
        [ProtoMember(2)]
        public string StringValue
        {
            get;
            set;
        }
    }
}

وما يلي فقط هو عميل .NET CF الخاص بي:

الفئة Echoserviceclient: protoclient، iechoservice {

    #region IEchoService Members

    public EchoServiceClient() : base(new HttpBasicTransport("my service URI"))
    {

    }

    public string Echo(string value)
    {
        return (string)this.Invoke("Echo", value);
    }

    public string EchoNull()
    {
        return (string)this.Invoke("EchoNull");
    }

    public CompositeType[] EchoData(CompositeType[] value)
    {
        return (CompositeType[])this.Invoke("EchoData", value);
    }

    #endregion
}

وهذه هي الطريقة التي أحاول أن أستهلكها WebService:

class Program
{
    static void Main(string[] args)
    {
        EchoServiceClient client = new EchoServiceClient();
        Console.WriteLine(client.EchoNull());
    }
}

أظل الحصول على استثناء مع الرسالة التالية:

يجب تعيين إما الطول المحتوي على رقم غير سالب، أو تعيين SendChunked إلى TRUE من أجل إجراء عملية الكتابة عند تعطيل IntainWriteStreamBuffer.

بقدر ما أستطيع أن أقول بعد الحفر في التعليمات البرمجية المصورة Protobuf-Net، يبدو أن المشكلة لا يوجد محتوى محدد. هل هناك أي طريقة أخرى لاستهلاك مواقع الويب WCF باستخدام Serialization Protobuf-Net في .NET CF أو طريقة لحل هذه المشكلة؟

مارك أنت على :)

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

المحلول

تحرير: أنا أساء قراءة السؤال؛ نسخة قصيرة: protoclient! = WCF. أنها غير متوافقة.


يعاني إطار مدمج أن مكدس WCF يفتقر إلى كل نقاط التمديد اللازمة لهذا؛ باختصار، لا يمكنك استخدام هذا النهج مع WCF + CF.

أنا على علم بمختلف مناهج العمل لبرنامج Protobuf-Net مع CF، رغم ذلك؛

  • اجعل خدمتك عودة byte[] أو (أفضل) Stream والتعامل معها يدويا؛ لا، هذا ليس جميلا، لكنه يعمل
  • يمكنك تجربة مكدس RPC البديل المضمن مع Protobuf-Net؛ أنا فكر في هذا يعمل على CF (أحتاج إلى التحقق، على الرغم من أن ذاكرتي تفشل)

المكدس البديل هو ProtoClient<T>; ؛ بصراحة لا أستطيع أن أذكر ما إذا كان يعمل على CF، وأنا لست في وضع يسمح له بالتحقق في الوقت الحالي. هو - هي ينبغي العمل على CF، كما أتذكر الاضطرار إلى إعادة التنفيذ Expression للحصول عليه لتجميع ... استخدام بعض الأمثلة (لكل من نمط 2.0 و 3.5 نمط) هنا.

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