【问题标题】:Timeout settings seem to have no effect超时设置似乎没有效果
【发布时间】:2016-05-21 05:58:21
【问题描述】:

我正在尝试为需要很长时间处理的特殊请求设置超时。因此,我正在尝试设置超时,如下所示:

client.RequestFilter = r => {
    r.Timeout = 1000000;
    r.ReadWriteTimeout = 1000000;
}

但是,这些设置似乎没有效果;请求仍然在大约 30 秒内超时。我可以使用一些技巧来正确设置超时吗?

ETA:我收到的响应是一个流;我是这样做的:

var stream = client.Send<Stream>(requestDto);

有没有更好的办法?

【问题讨论】:

  • 请尽可能包含 StackTrace / Exception 消息(和 .NET 平台信息,即 .NET 版本或 Mono / iOS / Android 等)。

标签: c# .net timeout servicestack


【解决方案1】:

ServiceStack 的服务客户端只是 HttpWebRequest 的包装器,因此您的代码最终会直接设置 HttpWebRequest TimeoutReadWriteTimeout 属性。

请求过滤器使您可以直接访问使用的HttpWebRequest 实例,并且设置超时属性应该可以按预期工作。除此之外,唯一可以修改 .NET HttpWebRequest 行为的类是 System.Net.ServicePointManager,它允许您配置一些属性,例如 DefaultConnectionLimitDnsRefreshTimeout 等。但是没有额外的请求超时属性。

您可以尝试的替代解决方案是使用 ServiceStack 的 JsonHttpClient,因为它建立在 Microsoft 较新的 HttpClient 库上,您可能会更幸运。虽然建议使用 Async API,因为 Sync API 只是阻塞了 HttpClient 的底层 Async API。

对于 API 调用本身,您应该在 using 块中访问流,例如:

using (var stream = client.Send<Stream>(requestDto))
{
}

【讨论】:

  • 谢谢mythz,我一回到办公室就试试这个,但同时,你能解释一下关于异步API的评论吗?就我而言,我实际上希望阻止呼叫;更具体地说,我将在后台线程上读取响应流,对其进行解析,执行一些计算,并定期向 UI(这是一个 Windows 窗体应用程序)报告进度。有没有更好的办法?
  • @Bugmaster 我是说微软新的HttpClient 只提供异步API,为了实现同步API,我们只是阻止任务来获得结果。这可以工作,但不是最佳的。在大多数情况下,使用异步 API,您不需要后台线程,因为它们是非阻塞的,所以我只需在主 UI 线程上等待并在那里进行所有处理。 HelloMobile 项目有一些在 GUI 应用程序中调用异步 API 的示例。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2018-05-18
  • 1970-01-01
  • 2017-02-11
  • 2011-11-13
相关资源
最近更新 更多