【问题标题】:Protobuf-net How to consume a WCF service in NET CF client?Protobuf-net 如何在 NET CF 客户端中使用 WCF 服务?
【发布时间】:2014-08-28 13:43:53
【问题描述】:

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

马克你在:)

【问题讨论】:

    标签: .net wcf protobuf-net coldfusion


    【解决方案1】:

    编辑:我误读了这个问题;短版: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 样式)是 here

    【讨论】:

    • 感谢您的回复。我会试着玩一下,看看我能从那个 RPC 堆栈中得到什么。
    • @Richard - 除了让 v2 ​​的 core 工作之外,我没有太多时间看 WP7(注意 v2 可作为源,但不是发布)。除此之外,byte[] 技巧当然应该有效并且具有简单的优点。本周早些时候我注意到 Silverlight 现在有一些以前缺少的扩展点,我可以使用这些扩展点更直接地连接它,但我不知道这是否包括 WP7。唉,我只有一个人……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多