我的HttpClient单例实现是否合适?

9

我在我的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以单例作用域注入依赖项,但那并不是重点。


4
工作中的代码可能需要移至代码审查 - crthompson
1
根据 http://msdn.microsoft.com/pl-pl/library/system.net.http.httpclient%28v=vs.110%29.aspx,实例成员不能保证线程安全。你确定不会遇到并发问题吗? - Wiktor Zychla
2
@WiktorZychla - HttpClient作为所有HTTP请求的会话。此外,所有HTTP操作方法都是线程安全的,就像您提供的同一链接中所述。 - dotnetster
1个回答

3

在第一次请求之后,有几个属性是无法更改的。我认为超时可能是其中之一,所以请注意。

您还需要小心个别请求不要干扰DefaultRequestHeaders,因为这可能会使其他请求混淆。

尝试共享HttpClient实例总是一个好主意。创建单例是这种情况的极端情况,但是如果小心使用,它应该可以正常工作。


3
知道了DefaultRequestHeaders。为什么单例是一个极端的情况?如果不使用单例,则在我的MVC应用程序中每个请求都会创建一个新的HttpClient。 - dotnetster
3
一个应用程序可能会访问多个API,因此有两个或三个HttpClient实例有时会非常有用。 - Darrel Miller
我同意你的观点。我的意图是每个用例使用一个单例实例。因此,如果我正在访问三个不同的API,则会有三个单例实例。 - dotnetster
@dotnetster 啊,那就好了! - Darrel Miller
@dotnetster 我无法在单例中设置超时。 - codebased
@codebased 你可以设置请求超时时间,但在第一次请求之后,它将变为只读。 - Darrel Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接