【问题标题】:RestSharp Timeout not workingRestSharp超时不起作用
【发布时间】:2017-10-05 11:08:46
【问题描述】:

我有一个 restsharp 客户端和请求设置如下:

var request = new RestRequest();
request.Method = Method.POST;
request.AddParameter("application/json", jsonBody, ParameterType.RequestBody);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
request.Timeout = -1;
request.ReadWriteTimeout = -1;
var url = $"http://{ipAddress}/api/calculate";
var client = new RestClient();
client.BaseUrl = new Uri(url);
client.Timeout = -1;
client.ReadWriteTimeout = -1;
var response = client.Execute(request);

此请求需要一段时间才能完成,大约需要 30 分钟。现在,我知道有更优雅的方法可以做到这一点,但是,对于这个请求,我需要这样做。

这个 RestSharp 客户端和请求在 Windows 服务中执行。服务执行请求时,会抛出 TimoutException,请求最大超时时间约为 40 秒。

由于某种原因,我设置的超时不适用于这种情况。

有人有解决办法吗?

【问题讨论】:

  • 请求不应该花费 30 分钟 - 你应该重新设计你的架构并使用一些异步方法。
  • 我同意@JaroslavŠtreit。如果处理已经完成,则可能更适合返回“201 - 已接受”响应此请求,并指示客户端调用程序应用程序在另一个端点/url 中再次检查。这样,客户端应用程序就不需要被阻塞等待长时间的操作完成。

标签: c# .net windows-services timeout restsharp


【解决方案1】:

如何更改默认超时时间长度:

将默认超时更改为:5 秒 - 例如 -(即 5000 毫秒):

    var client = new RestClient(BaseUrl);
    client.Timeout = 5000; // 5000 milliseconds == 5 seconds

就是这样,希望对您有所帮助!

【讨论】:

    【解决方案2】:

    通过设置ReadWriteTimeout 值,您可能没有按照您的想法进行操作。您的值将被忽略,因此您将获得默认值。

    根据这个答案What is default timeout value of RestSharp RestClient? RestSharp 在其实现中使用HttpWebRequest

    HttpWebRequest 的超时属性不能为负 HttpWebRequest.Timeout Property

    如果您查看 RestSharp 客户端代码,您会看到:https://github.com/restsharp/RestSharp/blob/70de357b0b9dfc3926c95d1e69967c7a7cbe874c/RestSharp/RestClient.cs#L452

            int readWriteTimeout = request.ReadWriteTimeout > 0
                ? request.ReadWriteTimeout
                : this.ReadWriteTimeout;
    
            if (readWriteTimeout > 0)
            {
                http.ReadWriteTimeout = readWriteTimeout;
            }
    

    【讨论】:

    • 感谢您的回答。那么,你建议我怎么做才能无限期超时?
    • 首先,我将操作分解为开始、状态和结果操作。拨打电话,返回一个令牌,然后检查状态。最后,得到保存的结果。如果这不可行,那么我建议尽可能长时间地进行超时,并希望最好。如果你控制 API,那么就去 1 号门后面。
    • 你是对的。在官方文档中,有一个 -1 表示无限超时。我把它写成 Int32.MaxValue 并且有效。谢谢老哥!
    【解决方案3】:

    更新到 RestSharp v106.2.2。
    https://github.com/restsharp/RestSharp/issues/1093

    【讨论】:

    • 这对我有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2018-12-27
    • 2012-05-15
    • 2011-02-21
    相关资源
    最近更新 更多