【问题标题】:Maintaining a single instance to a RestSharp client为 RestSharp 客户端维护单个实例
【发布时间】:2014-10-16 20:16:50
【问题描述】:

this question 类似,是否可以实例化客户端并保留它,还是我需要为每个调用(或一批调用)创建一个新实例?

【问题讨论】:

    标签: c# restsharp


    【解决方案1】:

    如有疑问,如有可能,请联系look at the source code

    从简短的角度来看,保留单个实例似乎是可以接受的,甚至是更好的方法,因为它主要负责执行 IRestRequest 请求。

    我曾经对HttpClient有同样的疑问,发现the following

    默认的 HttpClient 是开始发送请求的最简单方式。 单个 HttpClient 可用于同时发送任意数量的 HTTP 请求,因此在许多情况下,您只需创建一个 HttpClient,然后将其用于所有请求。

    如果需要并发,请浏览源代码以查看是否存在任何陷阱。您始终可以默认返回 HttpClient,它是自 .NET 4.5 以来 BCL 的一部分(并且可以通过 NuGet 在 .NET 4.0 上安装)

    【讨论】:

    • 请注意,对于依赖短 TTL DNS(如 Azure TrafficManager)的故障转移方案,Singleton 方法存在缺陷,尽管通常将其作为重用所有请求的最佳实践。您可以在包含的链接中查看讨论。 github.com/dotnet/corefx/issues/11224nimaara.com/2016/11/01/beware-of-the-net-httpclient
    • @pseabury 我认为他们在 .NET Core 2.1 中解决了它?至少我记得他们谈论过。
    • 是的,主要是。从 Github 线程的末尾,我引用了“AFAIK,它在 .NET Core 上也不起作用。在 .NET Core 2.1 中,我们引入了 SocketsHttpHandler.PooledConnectionLifetime。ASP.NET 中的新 HttpClientFactory 可以同时利用这两者,甚至可以为你。”但是,并不是每个人都能使用 .NETCore 2.1
    【解决方案2】:

    虽然这篇文章看起来很旧,但我来到这里并想对实际问题进行一些更正。 问:是否可以实例化客户端并保留它,或者我是否需要为每个调用创建一个新实例 A. 不,您不需要在每个请求上重新创建,同样适用于 RestClient 或 HttpClient,如果是 RestClient,您甚至可以使用相同的 RestRequest 实例,只需更新正文,如下所示: request.AddOrUpdateParameter("application/json", myJsonObject, RestSharp.ParameterType.RequestBody);

    【讨论】:

      【解决方案3】:

      只要你需要调用同一个服务器进行Rest Requests,只有一个RestClient并使用同一个客户端进行多个RestRequest是可以的。

      示例 C# 代码:

      var client = new RestClient("url here"))
      
      // First Call
      var request = new RestRequest("API/Path", Method.POST);
      request.AddParameter("parameter", "value");
      request.AddHeader("header", "value");
      var response = client.Execute(request);
      
      
      // Second Call
      var request2 = new RestRequest("API/Path", Method.POST);
      request2.AddParameter("parameter", "value");
      request2.AddHeader("header", "value");
      var response2 = client.Execute(request2);
      

      注意这里,client 变量。我使用了两次,因为它是两个请求的基点。没有必要为每个请求复制它。

      希望这会有所帮助。

      【讨论】:

      • 是否有任何我应该注意的长期问题,例如内存泄漏或延迟打开的连接?
      • 好吧,您可以随时在不需要时将其丢弃。据我所知,不应该有任何问题。为了更安全,如果你使用using 块怎么样。
      • RestClient 没有实现IDisposable。如果确实如此并且OP使用了它,那么他将不会持有一个实例。他必须为他的每个调用初始化一个新的。
      • 由于 RestClient 未实现 IDisposable,此代码甚至无法编译。此外,答案仅表明可能重用实例,而没有说明这样做是否明智。
      • 如果RestSharp 没有实现IDisposable,为什么这是公认的答案?
      【解决方案4】:

      试试:

      var client = new RestClient("http://server/");
      client.CookieContainer = new System.Net.CookieContainer();
      

      来源:https://github.com/restsharp/RestSharp/wiki/Cookies

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 2013-03-22
        • 1970-01-01
        • 2012-05-22
        • 2012-03-03
        相关资源
        最近更新 更多