现在是凌晨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中不可能这样做:(所以我需要一些其他方法来实现同样的目标,而且现在我被卡住了。任何建议都非常感谢!
答案 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.*
方法的单行调用,因此不会过于棘手。