如何在Xamarin Forms中创建一个Httpclient实例?

问题描述 投票:0回答:1

是否可以创建一个 httpclient 在Xamarin Forms应用程序中 OnStart() 并在我的应用程序中到处使用它?

c# android ios xamarin singleton
1个回答
3
投票

是的,您可以为您的应用程序中的所有请求使用同一个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, Timeout, Headers, Auth信息等的类。你需要重写类中的Equals方法来比较是否存在相同的配置。

public override bool Equals(object obj)
{
    // Logic to determine whether it is same config
}
© www.soinside.com 2019 - 2024. All rights reserved.