我的 HttpClient 单例实现是不是合适? [关闭]

Posted

技术标签:

【中文标题】我的 HttpClient 单例实现是不是合适? [关闭]【英文标题】:Is my implementaton of HttpClient singleton appropriate? [closed]我的 HttpClient 单例实现是否合适? [关闭] 【发布时间】:2013-11-19 14:46:47 【问题描述】:

我在我的 MVC4 项目中使用 System.Net.HttpClient (.Net 4.5)。我知道 HttpClient 的单个实例可用于 Web 应用程序中的所有 Http 请求。这是我对 HttpClient 单例的实现,它每次都应该返回单个实例。

 public sealed class HttpClientInstance: HttpClient

    // singleton instance
    private static readonly HttpClientInstance instance = new HttpClientInstance();

    static HttpClientInstance()  

    private HttpClientInstance() : base() 
        Timeout = TimeSpan.FromMilliseconds(15000)));
    
    /// <summary>
    /// Returns the singleton instance of HttpClient
    /// </summary>
    public static HttpClient Instance
    
        get
        
            return instance;
        
    

您认为这有什么问题吗?

我知道我可以使用 Ninject 在单例范围内注入依赖项,但这不是重点。

【问题讨论】:

工作代码应该移动到Code Review 据此msdn.microsoft.com/pl-pl/library/… 实例成员不保证是线程安全的。你确定不会遇到并发问题吗? @WiktorZychla - HttpClient 充当所有 HTTP 请求的会话。此外,HTTP 操作的所有方法都是线程安全的,如您提供的同一链接中所述。 【参考方案1】:

在您提出第一个请求后,您无法更改一些属性。我认为超时可能是其中之一,所以请注意这一点。

您还需要注意个别请求不要与 DefaultRequestHeaders 混淆,因为这可能会混淆其他请求。

尝试共享 HttpClient 实例总是一个好主意。创建一个单例是一个极端的例子,但小心它应该适合你。

【讨论】:

DefaultRequestHeaders 指出。为什么单例是一个极端情况?如果不使用单例,那么我只是在我的 MVC 应用程序中为每个请求创建一个新的 HttpClient。 @dotnetster 一个应用程序可能会访问多个 API,因此有时拥有两个或三个 HttpClient 实例会很有用。 我同意你的看法。我的意图是每个用例使用一个单例实例。因此,如果我使用三个不同的 API,那么我将拥有三个单例实例。 @dotnetster 啊,那么一切都很好! @dotnetster 我无法使用单音设置超时

以上是关于我的 HttpClient 单例实现是不是合适? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是单例 HttpClient X 分钟后接收新的 HttpMessageHandler

单例 httpClient 到 AppService 的单个实例

如何使我的应用程序单例应用程序? [复制]

java开发几点总结

为我的应用程序需要与之通信的每个主机使用一个 HttpClient 实例是不是可以?

每个代理而不是每个路由的 Apache HttpClient 4 个持久连接