Protobuf-net如何在NET CF客户端中使用WCF服务?

时间:2009-07-27 11:35:51

标签: .net wcf protobuf-net coldfusion

我正在尝试使用Protobuf-net的RPC功能来使用WCF Web服务。这是我的服务合同:

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
}

这就是我尝试使用网络服务的方式:

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

我不断收到以下消息的异常:

必须将ContentLength设置为非负数,或者将SendChunked设置为true,以便在禁用AllowWriteStreamBuffering时执行写操作。

据我所知,在挖掘protobuf-net的源代码之后,问题似乎是没有指定内容长度。有没有其他方法可以使用.NET CF中的protobuf-net序列化来使用WCF Web服务或者解决此问题的方法?

Marc你在:)

1 个答案:

答案 0 :(得分:0)

编辑:我误解了这个问题;简短版本:ProtoClient!= WCF。它们不兼容。


Compact Framework遭受WCF堆栈缺少所有必要的扩展点;简而言之,您不能将此方法用于WCF + CF。

我知道使用CF的protobuf-net的各种工作方法;

  • 让您的服务返回byte[]或(更好)Stream并手动处理;不,它不漂亮,但它有效。
  • 您可以尝试使用protobuf-net附带的替代RPC堆栈;我认为这适用于CF(我需要检查,但我的记忆失败了)

替代堆栈是ProtoClient<T>;老实说,我不记得它是否适用于CF,我现在无法检查。它在CF上运行,因为我记得必须re-implement Expression来编译它...一些示例用法(对于2.0风格和3.5风格)都是{{3} }。