2011-10-25 3 views
2

これは午前2時です。私はこの夜を把握しようとしています。SilverlightでProtoBuf-netシリアライザを使用するWCFサービスをどのように消費しますか?ProtoBuf-netシリアライザを使用するSilverlightでWCFサービスを使用するにはどうすればよいですか?

ただ一つのことを明確にするために、私のテストコンソールアプリケーションからサービスを呼び出すときにサービスはうまくいきます。

トップレベルのサービスはBasicHttpEndpoint(compabilityのために)を使って公開されていますが、私の問題を解決するなら他のバインディングのためにとても開いています。その後

... 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:

は、私は私のためのサービスを作成する一般的な方法、のgetServiceを持って次のように

とにかく、.NET(Silverlightのではない)に私がサービスを利用することができますこの方法は、抽出されます

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でこれを実行することはできません:(だから私は同じことを達成するための他の方法を必要とし、今、私がこだわっている任意のsugg。 estionsは高く評価されています!

答えて

1

SilverlightにはDataContractSerializerOperationBehaviorクラス(内部)がないため、シリアライザの「従来の」置き換え方法を使用することはできません。それは可能ですが、多くのステップが必要です。郵便でhttp://blogs.msdn.com/b/carlosfigueira/archive/2011/05/24/wcf-extensibility-custom-serialization-in-silverlight.aspxに公開する方法を公開しました。

+0

素晴らしい!私はそれをすぐにチェックします! –

0

はい、痛みです。カルロスは優れた答えを持っていますが、WCF境界でbyte[]またはStreamを転送し、手動でシリアライズ/デシリアライズを処理するオプションが減る可能性があります。ほとんどの場合、これはSerializer.*メソッドへの単一行呼び出しであり、過度に扱いにくいものではありません。

+0

Hehe ..ええ、痛みです。私はバイトを返すことを避けようとしていました。メソッドで約20のサービスを書き直さなければならない...うん...私はカルロスのポストを最初にチェックアウトします。 –

関連する問題