2017-08-16 69 views
0

是否可以在OnStart()中的Xamarin Forms應用程序中創建一個httpclient實例,並在我的應用程序中的任何地方使用它。如何在Xamarin表單中的HttpClient上創建實例

+1

是不是一個好主意,HttpClient的應在THEAD安全被調用,應該是一次性的,以正確地關閉所有網絡連接 – OrcusZ

+0

@OrcusZ這是不正確的。你應該絕對重用一個HttpClient實例。 [問題](https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed) –

+0

@WillDecker所以MS文件和來源錯誤?您可以使用單個實例或createInstance方法。但是你應該檢查實例是否需要處理。此外,HttpClient已經是線程安全的,但不是所有的方法,所以你應該在線程安全的場景中使用方法 – OrcusZ

回答

2

是的,你可以在你的應用中對所有請求使用相同的httpclient。但是您需要注意的是,如果有API具有不同的基本URL或標頭信息,那麼您需要爲此創建另一個httpclient。

我所做的是我有一個類來管理HttpClient實例。如果沒有與HttpConfig匹配的實例,它將創建並存儲它。如果已經有一個現有的實例,它會返回它。代碼

例(HttpService的是依賴注入):

public class HttpService : IHttpService 
{ 
    private static readonly int MAX_CLIENT = 5; 

    private Dictionary<HttpConfig, HttpClient> mClients; 
    private Queue<HttpConfig> mClientSequence; 

    public HttpService() 
    { 
     mClients = new Dictionary<HttpConfig, HttpClient>(); 
     mClientSequence = new Queue<HttpConfig>(); 
    } 

    private HttpClient CreateHttpClientAsync(HttpConfig config) 
    { 
     HttpClient httpClient; 

     if (mClients.ContainsKey(config)) 
     { 
      httpClient = mClients[config]; 
     } 
     else 
     { 
      // TODO: Create HttpClient... 

      if (mClientSequence.Count >= MAX_CLIENT) 
      { 
       // Remove the first item 
       var removingConfig = mClientSequence.Dequeue(); 
       mClients.Remove(removingConfig); 
      } 

      mClients[config] = httpClient; 
      mClientSequence.Enqueue(config); 
     } 

     return httpClient; 
    } 
... 
} 

HttpConfig是一流的,我存儲BASEURL,超時,接頭,驗證信息等,您將需要重寫Equals方法的類比較是否存在相同的配置。

public override bool Equals(object obj) 
{ 
    // Logic to determine whether it is same config 
} 
+0

單例模式 –

+0

你能給我一個你的類的示例來管理Httpclient嗎? – Afshin