2016-12-01 17 views
0

ASP.NET Webフォームで.NET 4.5 HttpClientクラスを使用したいと考えています。 私は一言で言えばブック(ページ663)でC#5.0で読んで:私たちのASP.NET WebフォームのウェブサイトでASP.NET 4.5 HttpClientをASP.NET Webフォームで使用する

Unlike with WebClient, to get the best performance with HttpClient, you must reuse same instance (otherwise things such as DNS resolution may be unnecessarily repeated.) HttpClient permits concurrent operations, . . .

、我々は別のWebサイトに接続する必要があります。 すべてのリクエストで単一のインスタンスを使用するために、アプリケーションプロパティでHttpClientのインスタンスを作成しました。このようなGlobal.asaxの何かで が書かれている:それは良い習慣です:

Application.Add("MateCatWorker", new HttpClient()); 

私の質問は、ということでしょうか?

+2

なぜそれは良い習慣ではないと思いますか? –

+0

私は上記の練習で私たちのWebサイトを昼食したとき、なぜ私が理解できないという2種類のエラーがクライアントから発生しました。 –

+1

あなたは何を修正しようとしましたか?また、何かがうまくいかないということがベストプラクティスではないことを意味するわけではなく、単にプラクティスの実装が貧弱である可能性があります。 –

答えて

1

良い習慣:いいえ、私の意見ではありません。アプリケーションコンテキストは、Webファーム内のインスタンス間で同期される可能性があるので、実際にはそのような変数を格納するためには使用しません。

動作しますか?はい、それらは複数のスレッドで使用しても安全であるため、あなたは、this MSDN articleの発言の項で述べた非同期メソッドのいずれかを使用している場合:

  • CancelPendingRequests
  • DeleteAsync
  • GetAsync
  • GetByteArrayAsync
  • GetStringAsync
  • 正直なところ
  • SendAsync

PutAsync

  • PostAsync
  • 、私はそれについてあまり心配しないでしょう。きついループで呼び出しを実行する場合は、同じオブジェクトを再利用してください。そうでない場合は、再使用しないでください。

  • +0

    回答ありがとうございますが、この文章の意味は次のとおりです。 'Webファーム内のインスタンス間でアプリケーションコンテキストが同期される可能性があることに注意してください。' –

    +0

    Webファーム内で同じアプリケーションを実行している場合、しかし、それはあなたの現在の質問にはあまりにもハイエンドかもしれません。 –

    +0

    @PatrickHofman彼はロードバランサを使用していないと思う。単なるWebサーバーだ。 –

    1

    は、MSDNのHttpClient Classによると、これらのメソッドは、スレッドセーフです:

    • CancelPendingRequests
    • DeleteAsyn
    • GetAsync
    • GetByteArrayAsync
    • GetStreamAsync
    • GetStringAsync
    • PostAsync
    • PutAsync
    • SendAsync

    HttpClient is intended to be instantiated once and re-used throughout the life of an application. Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. This will result in SocketException errors. Below is an example using HttpClient correctly.

    そして、私はApplicationHttpClientを保存しないことをお勧めします、私はシングルトンのファンではないが、そのためにシングルトンクラスを作成しますはるかに良いです。

    public class GoodHttpClient 
    { 
        // OK 
        private static readonly _httpClient HttpClient; 
    
        static GoodHttpClient() 
        { 
         _httpClient = new HttpClient(); 
        } 
    } 
    
    +0

    ASP.NET WFはコントローラを使用しません。また、変数をページに保存することは、一般的に1つの呼び出し点しか持たないためあまり役に立ちません。 –

    +0

    @PatrickHofmanはい、あなたは正しいです、今私はそれを今変更するつもりです。 –

    関連する問題