2016-11-25 4 views
0

私はプロキシを生成したクライアントを持っているし、すべてが良いですWCF:なぜサーバーインターフェイスのリファクタリングがクライアントプロキシ契約を破るのですか?

public class MyWebServices : IMyWebServices 
{ 
    pubic bool MethodA(){...} 
    pubic bool MethodB(){...} 
} 

...

[ServiceContract] 
    public interface IMyWebServices 
    {  
    [OperationContract] 
    bool MethodA(); 

    [OperationContract] 
    bool MethodB(); 
    } 

ようなインターフェイスのものを使用して、既存のWCF Webサービス、次に実装を持っています。

以降、このサービスの番号または操作が増加します。だから実装では、私は他のクラスにすべてのコードを因数分解し、メインクラスに注入します。

[ServiceContract] 
    public interface IMyWebServices : IServices1, IServices2 
    {    
    } 

    [ServiceContract] 
    public interface IServices1 
    {    
    [OperationContract] 
     bool MethodA(); 
    } 

    [ServiceContract] 
    public interface IServices2 
    {    
    [OperationContract] 
    bool MethodB(); 
    } 

    public class MyWebServices : IMyWebServices 
    { 
     private IServices1 _s1; 
     private IServices2 _s2; 
     public MyWebServices(IServices1, s1, IServices2, s2) 
     { 
      _s1 = s1; 
      _s2 = s2; 
     } 

     pubic bool MethodA() 
     { 
      return _s1.MethodA() 
     } 
     pubic bool MethodB() 
     { 
      return _s2.MethodB() 
     } 
    } 

問題は今、新たなサービスが展開されている場合は、既存の展開クライアント(そのプロキシなしの再生は)今エラーが出るということです。イベントは全く同じですが、私は

... EndpointDispatcherでContractFilterの不一致が原因で受信者で処理できません。これは、契約の不一致(送信者と受信者の間の不一致)または送信者と受信者の間のバインディング/セキュリティの不一致のいずれかが原因である可能性があります。送信者と受信者が同じ契約と同じバインディング(セキュリティ要件、たとえばメッセージ、トランスポート、なしなど)を持っていることを確認します。

したがって、サーバーサイドインターフェイスのリファクタリングはできません。

これは将来のリファクタリングのために何か方法がありますか、これは単に私たちがWCFを使用して生きなければならないものなのです(既存のクライアントのプロキシを再確認する必要があります)。

事前情報ありがとうございます。

+0

プロキシ再生の前後に自動生成されたコードの内容を調べてみてください。 – apocalypse

+0

契約は*です。 –

答えて

1

Svcutil生成サービスクライアントプロキシは、サービスメタデータに基づいています。サービスサイドのシグネチャを変更すると、新しいサービスのメタデータに基づいて新しいwsdlと壊れたクライアントが作成される可能性があります。これは、生成されたクライアントプロキシコードを(自動)使用しないもう1つの理由です。ちょっとした努力をするだけで、サービス契約(別々のアセンブリでサービスクライアントのために共有する)とChannelFactory(...)。CreateChannel()に基づいて独自のコードを管理することができます。この方法はあなたを助けます。サービス契約のリファクタリングには、クライアント側のコードが反映されます。

WSHttpBinding myBinding = new WSHttpBinding(); 
EndpointAddress myEndpoint = new EndpointAddress("http://localhost:8000/MyService.svc"); 
ChannelFactory<IMyService> myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint); 
IMyService instance = myChannelFactory.CreateChannel();    
var result = instance.MyMethod(...); 

または「WSHttpBinding_IMyServiceは」クライアントバインディングの構成名です

ChannelFactory<IMyService> myChannelFactory = new ChannelFactory<IMyService>("WSHttpBinding_IMyService"); 

:あなたも知っているし、簡単な同期サービスを使用して、非同期サービスメソッドを呼び出すことができますいくつかの余分な作業で

<system.serviceModel> 
      <bindings> 
       <wsHttpBinding> 
        <binding name=”WSHttpBinding_IMyService” /> 
       </wsHttpBinding> 
      </bindings> 
      <client> 
       <endpoint address=”http://localhost:8000/MyService.svc” 
            binding=”wsHttpBinding” 
            bindingConfiguration=”WSHttpBinding_IMyService” 
            contract=”MyService.IMyService” 
            name=”WSHttpBinding_IMyService”> 
       </endpoint> 
      </client> 
    </system.serviceModel> 

インタフェース!

+0

downvoting(議論のため)にコメントを追加することを検討してください – SalientBrain

+0

あなたは答えを暗示していますが、直接質問に答えていません。あなたのサービス契約に基づいてクライアントプロキシコードをどのようにすることができるかを示してください。 – markmnl

+0

これは問題ではなく、何度もカバーされていましたが、これを回答に追加しました。 – SalientBrain

関連する問題