2011-07-21 15 views
0

ASP.NETアプリケーションからWCF Webサービスにアクセスするためのベストプラクティスは何ですか?現在、各ページに私はそれは毎回、それは状態がFaultedあります呼び出しごとに、それを閉じて、新しいインスタンスを作成し、繰り返しの方法だ私は、フィールドASP.NETアプリケーションのWCFクライアント

private readonly _serviceClient = new WCFServiceClient(); 

とアクセス権を持っているサービスにアクセスする必要があります。しかし、私はこのようにすべきか、代わりにメソッド呼び出しごとに新しいインスタンスを作成するかはわかりません。これに関するベストプラクティスは何ですか?

+0

WCFClientを正しく処分する必要があります。次の記事をご覧ください:http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx – RubbleFord

答えて

1

彼のコメントにリンクされている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です。

2

Wenlong's blogをご覧ください。 .NET 3.5 Service Pack 1以降、ClientBaseを拡張するクライアントプロキシは静的なChannelFactoryインスタンスを共有し、アプリケーションドメイン全体を共有します。

私がテストし、実験したところから、ChannelFactoryとChannelの作成は、wcf呼び出しの初期化で最もリソースを消費する部分です。 "生成されたプロキシ"を使用し、いくつかのランタイム> = .NET 3.5 Service Pack 1を使用している場合は、すでにChannelFactoryパーツを使用しています。私は、あなたのサービス契約がより大きくなると(より多くのメソッド、より多くの型、より多くのパラメータなど)、Channelの作成がさらに困難で長くなることを見てきました。したがって、あなたはサービス契約を何とかコンパクトに保つ​​ことをお勧めします。

基本的には、生成されたプロキシを使用している場合、私はキャッシング/共有がパフォーマンスの向上をもたらすとは思わない。

同じサービスへの単一のコードブロックで連続して呼び出す場合は、同じサービスプロキシインスタンスを使用することをお勧めします。呼び出しごとに1つ作成することは最適な方法ではありません。

1

アプリケーション全体でサービスクレンジングを1つだけ使用できます。依存関係注入を使用している場合は、UnityやSpring.NetのようなIoCフレームワークのいずれかを使用して、クライアントをコンテナ内のSingletonインスタンスとして構成できます。 Singletonインスタンスを作成するために別のコードを記述する必要はありません。

関連する問題