2017-08-16 74 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