2011-07-03 15 views
0

私はwcfクライアントのメモリ使用量について読んだことがあります。今まで何をしているのかは間違っています。
私はwcfクライアントを使用して、私は新しい呼び出しごとにクライアントを作成しました。 (自己ホスティングとiisのために)。
どうすればいいですか?私はメンバーとして1つのクライアントを作成し、それを全面的に使用する必要がありますか?
本当にwcfクライアントのメモリ使用量はいくらですか?
ありがとうwcfクライアントを使用する最も良い方法は何ですか? (メモリワイズ)

+0

ここに実際に問題がありますか?もしそうなら、それらを処分していますか? –

+0

さて、私はメモリの問題があり、 'using'ステートメントを緩めてそれらを適切に破棄することでそれらを修正しました。クライアントを作成するのがより高価な部分が何であるか知りたかったのですが、' ChannelFactory'や 'ChannelFactory.CreateChannel ) 'メソッドを呼び出します。 – guyl

答えて

1

新しいエンドポイントからサービス操作を呼び出す必要がある場合にのみ、新しいクライアントを作成する必要があると思いますが、バインドは通常同じままです。つまり、特定の契約+バインディングでも異なるエンドポイントでもクライアントを作るためのファクトリクラスを作成することができます。例えば、以下はWebHttpBindingのためになるが、あなたは何が必要結合置き換えることができます:

public class WebHttpClient<T> 
{ 
    protected WebHttpBinding Binding { get; private set; } 

    public WebHttpClient() 
    { 
     // set default binding here 
    } 

    public WebHttpClient(WebHttpBinding binding) 
    { 
     Binding = binding; 
    } 

    public T Get(string uri) 
    { 
     EndpointAddress _endpoint = new EndpointAddress(uri); 
     ChannelFactory<T> _factory = new ChannelFactory<T>(Binding, _endpoint); 

     _factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
     return _factory.CreateChannel(); 
    } 
} 

をTは、あなたのサービス契約であるところ。

+0

意味特定のバインディングのクライアントをすでに作成している場合、ファクトリは作成されたクライアントを返しますか? – guyl

+0

メソッドGetを呼び出すたびに、指定したエンドポイントでサービスコントラクトの実装のインスタンスが返されます。 Theresにはさまざまなルートがありますが、ChannelFactory を使用する基本的な方法はクライアントを作成するのに最適です。 –

+1

WCF操作の中で最も高価な部分は、クライアントを作成することです。上の例は良いですが、私はそれをさらに一歩踏み出し、ChannelFactory をそれぞれのサービスとキャッシュに1回呼び出してから、チャネルを作成するときに、キャッシュされたコピーから行います。そうすれば、複数のチャネルを生成することができますが、初期コストは一度しか発生しません。 – Tim

関連する問題