如何在使用ProtoBuf-net序列化程序的Silverlight中使用WCF服务?

时间:2011-10-25 23:56:40

标签: silverlight wcf protobuf-net

现在是凌晨2点,我整个晚上一直试图弄清楚这一点:我如何在使用ProtoBuf-net序列化器的Silverlight中使用WCF服务?

只是澄清一件事:从我的测试控制台应用程序调用它们时,服务很有效。

使用BasicHttpEndpoint(为了兼容性)公开顶级服务,但如果能解决我的问题,我对其他绑定非常开放。

无论如何,在.NET(不是Silverlight)中,我可以按如下方式使用服务:

我有一个通用方法GetService,它为我创建服务:

... Code removed ...
EndpointAddress endpointAddress = new EndpointAddress(address);
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential)
{
    MaxReceivedMessageSize = int.MaxValue,
    MaxBufferSize = int.MaxValue,
};
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;

ContractDescription contract = ContractDescription.GetContract(typeof(TServiceType));
ServiceEndpoint serviceEndpoint = new ServiceEndpoint(contract, binding, new EndpointAddress(address));

factory = new ChannelFactory<TServiceType>(serviceEndpoint);
AddBehaviors(serviceEndpoint);

ClientCredentials defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(defaultCredentials);
factory.Endpoint.Behaviors.Add(credentials);
... Code removed ...

然后提取AddBehavior方法:

private static void AddBehaviors(ServiceEndpoint serviceEndpoint, int maxItemsInObjectGraph = int.MaxValue)
{
    foreach (OperationDescription operation in serviceEndpoint.Contract.Operations)
    {
        DataContractSerializerOperationBehavior operationBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
        if (operationBehavior != null)
        {
            operation.Behaviors.Remove(operationBehavior);
        }

        ProtoOperationBehavior protoOperationBehavior = operation.Behaviors.Find<ProtoOperationBehavior>();
        if (protoOperationBehavior == null)
        {
            protoOperationBehavior = new ProtoOperationBehavior(operation);
            operation.Behaviors.Add(protoOperationBehavior);
        }
        protoOperationBehavior.MaxItemsInObjectGraph = int.MaxValue;
    }
}

不幸的是,在Silverlight中不可能这样做:(所以我需要一些其他方法来实现同样的目标,而且现在我被卡住了。任何建议都非常感谢!

2 个答案:

答案 0 :(得分:1)

Silverlight没有DataContractSerializerOperationBehavior类(它是内部的),因此您无法使用“传统”方式替换序列化程序。这是可能的,但它需要很多步骤。我在http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/24/wcf-extensibility-custom-serialization-in-silverlight.aspx的帖子中发布了一种方法。

答案 1 :(得分:0)

是的,这很痛苦。 Carlos对此有一个很好的答案,但减少的选项可能是“在WCF边界上转移byte[]Stream,并手动处理序列化/反序列化”。在大多数情况下,这是对Serializer.*方法的单行调用,因此不会过于棘手。