我正在尝试使用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你在:)
答案 0 :(得分:0)
编辑:我误解了这个问题;简短版本:ProtoClient!= WCF。它们不兼容。
Compact Framework遭受WCF堆栈缺少所有必要的扩展点;简而言之,您不能将此方法用于WCF + CF。
我知道使用CF的protobuf-net的各种工作方法;
byte[]
或(更好)Stream
并手动处理;不,它不漂亮,但它有效。替代堆栈是ProtoClient<T>
;老实说,我不记得它是否适用于CF,我现在无法检查。它应在CF上运行,因为我记得必须re-implement Expression
来编译它...一些示例用法(对于2.0风格和3.5风格)都是{{3} }。