【问题标题】:using .NET 4.5 HttpClient in ASP.NET Web form在 ASP.NET Web 表单中使用 .NET 4.5 HttpClient
【发布时间】:2016-12-01 08:29:07
【问题描述】:

我想在 ASP.NET Web 窗体中使用 .NET 4.5 HttpClient 类。 我读过 C# 5.0 in a NutShell 书(第 663 页):

与 WebClient 不同,要使用 HttpClient 获得最佳性能,您必须重用相同的实例(否则诸如 DNS 解析 可能不必要地重复。) HttpClient 允许并发 操作,. . .

在我们的 ASP.NET web Form 网站中,我们需要连接到另一个网站。 我在 Application 属性中创建了一个 HttpClient 实例,以便在所有请求中使用单个实例。 在 Global.asax 中是这样写的:

Application.Add("MateCatWorker", new HttpClient());

我的问题是:这是一个好习惯吗?

【问题讨论】:

  • 为什么你认为这不是一个好的做法?
  • 因为:当我用上述做法浏览我们的网站时,我遇到了来自客户的 2 种错误,我无法理解为什么。
  • 那么您尝试解决什么问题?此外,仅仅因为某些东西不起作用并不意味着它不是最佳实践,它可能只是实践的糟糕实施。
  • @EhsanAbidi 什么错误?您尚未发布任何错误消息或描述任何问题。您发布了 very 奇怪的 Application.Add 行 - 重用 empty HttpClient 有什么意义?您仍然需要为每个绝对 URL 重复 DNS 解析!

标签: c# asp.net .net


【解决方案1】:

根据 MSDN 上的HttpClient Class,这些方法是线程安全的:

  • CancelPendingRequests
  • 删除异步
  • GetAsync
  • GetByteArrayAsync
  • GetStreamAsync
  • GetStringAsync
  • 后异步
  • PutAsync
  • 发送异步

HttpClient 旨在被实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化一个 HttpClient 类 每个请求都将耗尽大量可用的套接字数量 负载。这将导致 SocketException 错误。下面是一个例子 正确使用 HttpClient。

而且我建议不要将HttpClient 存储到Application,我不是单例的粉丝,但创建一个单例类会更好。

public class GoodHttpClient
{
    // OK
    private static readonly _httpClient HttpClient;

    static GoodHttpClient()
    {
        _httpClient = new HttpClient();
    }
}

【讨论】:

  • ASP.NET WF 不使用控制器,另外,将变量保存在页面中并不是很有用,因为您通常只有一个调用点。
【解决方案2】:

一个好的做法:不,在我看来不是。请注意,应用程序上下文可能会在网络场中的实例之间同步,因此我不会真正使用它来存储此类变量。

有效吗?是的,如果您使用this MSDN article 的备注部分中提到的异步方法之一,因为它们可以安全地在多个线程中使用:

  • CancelPendingRequests
  • DeleteAsync
  • GetAsync
  • GetByteArrayAsync
  • GetStreamAsync
  • GetStringAsync
  • PostAsync
  • PutAsync
  • SendAsync

老实说,我不会太担心。如果您在紧密循环中运行调用,请重用相同的对象。如果没有,请不要重复使用。

【讨论】:

  • 谢谢您的回答,但这句话是什么意思:'请注意,应用程序上下文可能在网络场中的实例之间同步'
  • 如果您在网络场中运行相同的应用程序,它会共享应用程序上下文。但这对于您当前的问题可能太高端了。
  • @PatrickHofman 我认为他没有使用任何负载均衡器,它只是一个单一的 Web 服务器。
  • @EhsanAbidi 这些答案对您来说是否足够,还是您需要我们提供更多信息?
  • 那么请随意接受任何一个答案。还要查看您的旧帖子,看看这些答案对您来说是否足够。您可以通过选中答案前的复选标记来接受答案。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多