2

我正在尝试使用 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 服务或解决此问题的方法?

马克你在:)

4

1 回答 1

0

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


Compact Framework 的缺点是 WCF 堆栈缺少所有必要的扩展点;简而言之,您不能将这种方法与 WCF + CF 一起使用。

不过,我知道带有 CF 的 protobuf-net 的各种工作方法;

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

替代堆栈是ProtoClient<T>; 老实说,我不记得它是否适用于 CF,而且我目前无法检查。它应该可以在 CF 上运行,因为我记得必须重新实现Expression才能使其编译...这里有一些示例用法(适用于 2.0 样式和 3.5 样式

于 2009-07-27T11:46:47.250 回答