彼のコメントにリンクされているRubbleFordの記事に似たようなことをしましたが、私は複数のサービスを扱っていたので、私はChannelFactoryを使用し、最初の作成時に返されたオブジェクトをキャッシュしました。その後、必要に応じて新しいチャンネルを作成し、使用してから、必要に応じて終了/中止します。ヘルパー・メソッドは、別のDLL(私は例えば一般的なを使用します)にあります。
:私のクライアントコードで
// bindingName refers to the Web.config binding section's name
public static T GetFactoryChannel<T>(string address, string bindingName)
{
string key = typeof(T).Name;
// OpenChannels is a property that refers to a Dictionary<string, object> holding the key and the channel factory
if (!OpenChannels.ContainsKey(key))
{
ChannelFactory<T> factory = new ChannelFactory<T>();
factory.Endpoint.Address = new EndpointAddress(new System.Uri(address));
factory.Endpoint.Binding = new NetTcpBinding(bindingName);
OpenChannels.Add(key, factory);
}
T channel = ((ChannelFactory<T>)OpenChannels[key]).CreateChannel();
((IClientChannel(channel)).Open();
return channel;
}
、私はこの(共通でヘルパー・メソッドを持つ)のような何かをしたいです
IMyContract myContract = Common.GetChannelFactory<IMyContract>("net.tcp://someaddress/service", "MyNetTcpBinding");
myContract.SomeMethod();
Common.CloseChannel(myContract); // handles the necessary work to close or abort the channel.
私はWCFで作業を始めた1年前にウェブ上に投稿されたいくつかの記事に基づいてこれを開発しました。 OpenChannels辞書オブジェクトは私のケースではAppDomainに格納されています(WCFライブラリのほとんどがWCFライブラリなので)。したがって、指定されたアプリケーションの存続期間中に各チャネルファクトリを一度作成する必要があります。
必要に応じてGetFactoryChannelメソッドに必要なロジック(資格情報やさまざまな種類のバインディングなど)を追加できます。また、プロジェクトへのサービス参照を追加するのではなく、生成されたプロキシファイルをsvcutilから使用することにも注意してください。これは3.5、btwです。
出典
2011-07-21 07:35:48
Tim
WCFClientを正しく処分する必要があります。次の記事をご覧ください:http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx – RubbleFord