【问题标题】:How to create one instance of Httpclient in Xamarin Forms如何在 Xamarin Forms 中创建一个 Httpclient 实例
【发布时间】:2017-08-16 14:19:27
【问题描述】:

是否可以在 OnStart() 的 Xamarin Forms 应用程序中创建一个 httpclient 实例并在我的应用程序中的任何地方使用它?

【问题讨论】:

  • 不是一个好主意,HttpClient 应该被安全地调用并且应该是一次性的以正确关闭所有网络连接
  • @OrcusZ 这根本不是真的。您绝对应该重用 HttpClient 的单个实例。 Similar question
  • @WillDecker 所以 MS Doc & Sources 是错误的?您可以使用单个实例或 createInstance 方法。但是您应该检查是否需要处置该实例。此外,HttpClient 已经是线程安全的,但不是所有的方法,所以你应该在线程安全的场景中使用这些方法
  • @OrcusZ 你应该重用 HttpClient。它会在创建时创建昂贵的资源。它是线程安全的,因此没有理由持续使用昂贵的资源。
  • @NickTurner 哇所有线程 ^^。是的,这是真的,我在 xForms 中阅读了很多关于异步调用和 http 调用的内容,出于性能目的,最好只保留一个连接:)

标签: c# android ios xamarin singleton


【解决方案1】:

是的,您可以对应用中的所有请求使用相同的 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
}

【讨论】:

  • 单例模式
  • 你能给我一个关于管理 Httpclient 的类的示例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多