私は大規模なシステムに取り組んでおり、そのためにWCFを使用してWebサービスにアクセスする必要があります。テストコードは正常に機能します。次に、WCFクライアントコードをより大きなシステムに統合する必要があります。既存の「app.config」ファイルに追加できません。クライアントコードで使用する別の.configファイルを指定したいと思います。
どうすればこれを達成できますか?
ありがとう!
私は大規模なシステムに取り組んでおり、そのためにWCFを使用してWebサービスにアクセスする必要があります。テストコードは正常に機能します。次に、WCFクライアントコードをより大きなシステムに統合する必要があります。既存の「app.config」ファイルに追加できません。クライアントコードで使用する別の.configファイルを指定したいと思います。
どうすればこれを達成できますか?
ありがとう!
2つのオプションがあります。
オプション1。チャネルの操作。
チャネルを直接操作している場合、.NET4.0および.NET4.5にはConfigurationChannelFactoryがあります。MSDNの例は次のようになります。
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "Test.config";
Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
fileMap,
ConfigurationUserLevel.None);
ConfigurationChannelFactory<ICalculatorChannel> factory1 =
new ConfigurationChannelFactory<ICalculatorChannel>(
"endpoint1",
newConfiguration,
new EndpointAddress("http://localhost:8000/servicemodelsamples/service"));
ICalculatorChannel client1 = factory1.CreateChannel();
Langdonが指摘しているように、次のようにnullを渡すだけで、構成ファイルのエンドポイントアドレスを使用できます。
var factory1 = new ConfigurationChannelFactory<ICalculatorChannel>(
"endpoint1",
newConfiguration,
null);
ICalculatorChannel client1 = factory1.CreateChannel();
これについては、MSDNのドキュメントで説明されています。
オプション2。プロキシの操作。
コードで生成されたプロキシを使用している場合は、構成ファイルを読み取ってServiceModelSectionGroupをロードできます。単に使用するよりも少し多くの作業ConfigurationChannelFactory
が必要ですが、少なくとも、生成されたプロキシを引き続き使用できます(内部では、を使用しChannelFactory
て管理IChannelFactory
します。
Pablo Cibraroは、この良い例をここに示しています。任意の構成ソースからのWCFバインディングと動作の取得
好きなようにこれを行うことはできません-近づくことはできますが、完全に行うことはできません。
できることは、このセクションをメインアプリの構成ファイルに追加することです。
<system.serviceModel>
<bindings configSource="bindings.config" />
<behaviors configSource="behaviors.config" />
<client configSource="client.config" />
<services configSource="services.config" />
.....
</system.serviceModel>
したがって、内部のセクションごとに<system.serviceModel>
、属性を使用して外部構成ファイルを指定できますconfigSource=
(Visual Studioの赤い波線が混乱しないようにしてください-はい、機能します!)。
これは任意の構成セクションに対して実行できますが、残念ながら、セクショングループ全体に対してこれを実行する方法はありません(<system.serviceModel>
)。
マーク
残念ながら、WCFにはこれに対する組み込みのサポートはありません。独自のChannelFactoryサブクラスを作成し、構成ファイルを自分でロード/解析する必要があります。実装の詳細については、MSDNフォーラムのこの投稿を確認してください。
または、シンプルで簡単な方法で実行できます。この投稿のように、DataSet / DataTableモデルを使用して構成(作業コードを含む)を保存/取得するカスタム構成ファイルを実装します。
したがって、marc_sで言及されているオプションは機能します。バインディングおよび他のすべての場所のconfigSourceプロパティを認識しないというVisualStudioの警告を無視します。