2016-12-01 49 views
0

我想在ASP.NET Web窗體中使用.NET 4.5 HttpClient類。 我在C#5.0簡而言之圖書閱讀(頁663):在ASP.NET Web窗體中使用.NET 4.5 HttpClient

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, . . .

在我們的ASP.NET Web窗體的網站,我們需要連接到其他網站。 我在應用程序屬性中創建了一個HttpClient實例,以在所有請求中使用單個實例。在Global.asax中這樣的事情 寫的是:

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

我的問題是:這是一個好的做法呢?

+2

你爲什麼認爲這不是好的做法? –

+0

因爲:當我按照上述慣例推出我們的網站時,我遇到了來自客戶的兩種錯誤,我不明白爲什麼。 –

+1

那麼你試圖修復它?另外,僅僅因爲某些事情不起作用並不意味着它不是最佳實踐,它可能只是實踐的一個不好的實施。 –

回答

1

一個好習慣:不,在我看來不是。請注意,應用程序上下文可能會在Web場中的實例之間同步,因此我不會真正使用它來存儲此類變量。

它工作嗎?是的,如果你使用的在this MSDN article的言論一節中提到的異步方法之一,因爲這些是安全的在多線程的使用方法:

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

老實說,我不會太擔心它。如果您在緊密循環中運行呼叫,請重複使用同一個對象。如果沒有,請不要重複使用。

+0

感謝您的回答,但是這句話意味着什麼:'請注意,應用程序上下文可能在Web場中的實例之間同步' –

+0

如果您在Web場中運行相同的應用程序,它將共享應用程序上下文。但是對於你目前的問題,這可能太高端了。 –

+0

@PatrickHofman我認爲他不使用任何負載平衡器,它只是一個單一的Web服務器。 –

1

按照HttpClient Class MSDN上這些方法是線程安全的:

  • 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.

,我建議不存儲HttpClientApplication,我不是單身的粉絲,但創建一個單例類要好得多。

public class GoodHttpClient 
{ 
    // OK 
    private static readonly _httpClient HttpClient; 

    static GoodHttpClient() 
    { 
     _httpClient = new HttpClient(); 
    } 
} 
+0

ASP.NET WF不使用控制器,另外,將變量保存在頁面中並不是非常有用,因爲您通常只需要調用一個點。 –

+0

@PatrickHofman是的,你說得對,我現在要改變它。 –

相關問題