如何在Xamarin表单中的HttpClient上创建实例
是否可以在OnStart()中的Xamarin Forms应用程序中创建一个httpclient实例,并在我的应用程序中的任何地方使用它。如何在Xamarin表单中的HttpClient上创建实例
是的,你可以在你的应用中对所有请求使用相同的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
}
单例模式 –
你能给我一个你的类的示例来管理Httpclient吗? – Afshin
是不是一个好主意,HttpClient的应在THEAD安全被调用,应该是一次性的,以正确地关闭所有网络连接 – OrcusZ
@OrcusZ这是不正确的。你应该绝对重用一个HttpClient实例。 [问题](https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed) –
@WillDecker所以MS文件和来源错误?您可以使用单个实例或createInstance方法。但是你应该检查实例是否需要处理。此外,HttpClient已经是线程安全的,但不是所有的方法,所以你应该在线程安全的场景中使用方法 – OrcusZ