2016-11-18 25 views
1

WCFを使用しているサーバー&クライアントソリューションがあります。クライアントは実行時にURLに関するサービスをアクティブなサーバーに要求し、これを設定できるようにするためにChannelFactoryを使用します。しかし、私はまだconfigファイルから他のすべてのWCF設定を使用する必要があります。これは私がそれを行う方法です。設定ファイルからの設定でWCF channelfactory?

var clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

      var address = string.Empty; 
      for(int i = 0; i < clientSection.Endpoints.Count; i++) 
      { 
       if(clientSection.Endpoints[i].Name == endpointConfigurationName) 
       { 
        var endpointAddress = new EndpointAddress(clientSection.Endpoints[i].Address.ToString()); 
        var netHttpBinding = new NetHttpBinding(clientSection.Endpoints[i].BindingConfiguration); 
        var serviceEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(T)), netHttpBinding, endpointAddress); 

        var channelFactory = new ChannelFactory<T>(serviceEndpoint); 

        break; 
       } 
      } 

問題は、私はこのようなエンドポイントの一部で使用されている2 BehaviorExtensionsを得たことです。

<services> 
<endpoint binding="netHttpBinding" behaviorConfiguration="protoEndpointBehavior" address="BinaryHttpProto" bindingNamespace="http://MyApp.ServiceContracts/2007/11" contract="MyApp.ServiceContracts.IMyAppClientService" /> 
</services> 

<behaviors> 
<endpointBehaviors> 
     <behavior name="protoEndpointBehavior"> 
      <protobuf /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

<extensions> 
     <behaviorExtensions> 
     <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" /> 
     </behaviorExtensions> 
    </extensions> 

質問は私がclientSection.Endpointsからどのように読み取ったかです。 channelFactoryに設定しますか?私は、このように手動で、その後作成することができることを知っている:

serviceEndpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior()); 
      serviceEndpoint.EndpointBehaviors.Add(new CustomMessageInspectorBehavior()); 

しかし、これは、ハードコーディングされた静的になり、それは私が設定からそれを変更できるようにする必要があり、すべてのエンドポイントに適用されます。

答えて

0

私はコード内のすべてを作成する必要がありますが、私がカスタムのものをたくさん使っている私の場合では、混合ソリューションはうまくありませんでした。

+0

おめでとうございます。しかし、あなたの答えはsomの例と説明だけで役に立ちます。 –

0

自分でChannelFactoryを作成する必要はありません。 ClientBase<T>から継承するClientServiceクラスを作成するだけです。 ClientBase<T>のコンストラクタはEndpointNameを受け取り、このEndpointに関連付けられた動作を自動的に追加します。 ClientBase<T>ChannelFactory<T>にアクセスする可能性もあり、好きなだけチャンネルを開くことができます。あなたがさらに必要とするのは、使用する設定で各エンドポイントの名前を追加することだけです。

<endpoint binding="..." name="MyEndPoint" ... /> 
+0

このClientBaseクラスの各サービスメソッドのコードを追加する必要があるようですね。このように:return base.Channel.MySimpleMethod(request);これは本当ですか?私は何百ものWebメソッドを持っています。 – Banshee

+0

はい、これは欠点であり、通常の方法です。私たちは、2つの方法でそれを回避しました。 WebServiceには2つのメソッドがあります.1つはリクエストと結果のリクエスト、もう1つは結果なしです。他のすべてのものはリクエストを通して処理され、与えられたRequestTypeを見て、リクエストを処理できるハンドラを呼び出します。 – Rabban

+0

申し訳ありません。どのように何百ものWebメソッドが2に過ぎないのでしょうか?すべてがメソッド名、要求、応答を所有する必要がありますか? – Banshee

関連する問題