问题标签 [polly]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1469 浏览

unit-testing - 在单元测试中使用依赖注入模拟 Polly 策略上的静态 HttpClient

我有一个这样的静态 HttpClient 设置:

称之为——Client.Instance.ExecuteRequest("request string here");

有一个构造函数可以采用模拟的 Polly 策略和模拟的 HttpClient。

Policies类看起来像这样:

在实际情况中,我只使用PolicyWrap.

策略解释 - 每 1 秒超时重试被触发。FallbackPolicy被调用后可以重试 3 次。在单元测试中,我想模拟一个 HttpClient ,因此每次调用它都会超时(> 1 秒睡眠),因此将触发 3 次超时/重试并FallbackPolicy启动。

这里的问题是 HttpClient 是静态的,我希望它保持这种状态,所以我不能使用依赖注入来模拟它。

到目前为止,我的测试如下所示:

感谢您的任何意见。

编辑: 我已经设法使用依赖注入从单元测试中模拟 HttpClient,方法是使其非静态并将其传递给var httpMessageHandler = new Mock<HttpMessageHandler>();构造函数。(我不想做的方式,但没有想出另一种方式)

重试策略现在似乎可以正确触发,但是 Timeout 没有按预期工作,将我的问题转移到:Polly TimeoutPolicy delegate not being hit in async context

0 投票
1 回答
3871 浏览

asynchronous - Polly 的 Policy.TimeoutAsync 不适用于异步上下文中的 PolicyWrap

这是一个完整的工作示例(复制/粘贴它并玩弄,只需获取 Polly Nuget)

我有以下控制台应用程序代码,它向“ http://ptsv2.com/t/v98pb-1521637251/post ”上的 HTTP 客户端沙箱发出 POST 请求(您可以访问此链接“ http://ptsv2.com/ t/v98pb-1521637251 ”查看配置或让自己成为“厕所”):

Http 客户端等待 4 秒,然后返回响应。

我已经设置了这样的策略(超时策略设置为等待 1 秒的响应):

但是,onTimeoutAsync 委托根本没有被命中,控制台打印出以下内容:

它包含在 PolicyWrap 中并且是异步的,我不知道为什么它没有被击中。任何信息都非常感谢。

0 投票
1 回答
1743 浏览

unit-testing - Polly 验证在单元测试中 httpclient 超时/重试了多少次

这不是一个完全有效的解决方案,只是使问题更清晰、更具可读性的部分代码。

我在这里阅读了 Polly 的文档,但是我确实需要在 httpClient 超时后测试是否命中了以下 TimeoutPolicy 的委托(另外,如果将TimeoutPolicyonTimeoutAsync与 RetryPolicy 一起包装 -它被命中了多少次):

TimeoutPolicy 设置为 1 秒后未收到来自 HTTP 客户端的任何内容后超时(HttpClient 的模拟延迟 4 秒,如下图所示)

策略被嘲笑为能够在其上调用 .Verify() 以进行断言:

我使用模拟的 HTTP 客户端和模拟的超时策略执行调用:

断言:

但是,测试结果显示它已被调用 0 次而不是 1 次。谢谢您的任何回答。

0 投票
1 回答
221 浏览

c# - 如何知道 retryPolicy.excute() 中的重试迭代次数

对于同一请求的多次重试,我收到错误“请求消息已发送。无法多次发送相同的请求消息”。因此,据我所知,我需要重新创建一个新的 HttpRequestMessage 以进行第二次重试。有没有办法知道 retryPolicy.Execute() 中的重试迭代次数,以便我可以克隆 HttpRequestMessage 以进行第二次重试空?

0 投票
1 回答
3261 浏览

c# - 对数据库连接失败实施连接重试策略

我有我的云数据库,即 Azure,所以有时我会收到这样的网络相关错误:

建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

我决定在一段时间后使用Polly重试连接尝试,但我不确定我是否以正确的方式使用它:

据我了解,Polly 的工作方式如下:

第一次尝试:等待 3 秒然后ConnectionManager.OpenConnection(cn)再次调用

第二次尝试:等待 6 秒,然后ConnectionManager.OpenConnection(cn)再次调用DbException

第三次尝试:等待 9 秒,然后ConnectionManager.OpenConnection(cn)再次调用DbException

但如果DbException再次发生怎么办?它会处理还是发送到我的 catch 子句包装 Process 方法?

我不确定我是否正确理解并正确实施。

我将不胜感激任何帮助:)

0 投票
1 回答
937 浏览

c# - 具有悲观超时策略的 C# Polly 在多个线程上运行缓慢?

考虑这段代码:

我得到以下输出:

最后抛出 Polly.Timeout.TimeoutRejectedException。我真的不明白为什么要花这么长时间来执行?从输出看来,前 8 个任务并行执行,然后变得非常慢。如果没有超时策略或乐观超时策略,它会立即运行。但在我的情况下,只能使用悲观超时策略。

使用最新的 Polly 版本,即 6.0.1。

0 投票
1 回答
2648 浏览

c# - 在 Polly 重试策略中重用 HttpRequestMessage

一个HttpRequestMessage对象只能使用一次;以后尝试使用同一个对象会引发异常。我正在使用 Polly 重试一些请求,我遇到了这个问题。我知道如何克隆请求,有很多关于 SO 的示例,但我不知道如何克隆请求并在 Polly 重试时发送新请求。我怎样才能做到这一点?

这些是我的政策,供参考。这是一个 Xamarin 应用程序。如果出现网络故障,我想重试几次,如果响应未经授权,我想使用保存的凭据重新验证并再次尝试原始请求。

由于重用,这不起作用HttpRequestMessage,但这是我想要完成的:

0 投票
1 回答
389 浏览

c# - 在 Polly 中将瞬时故障捕获与重新授权相结合

我正在使用 Xamarin 编写移动应用程序,因此我需要一个策略来重试网络请求。我的应用调用的 API 提供了过期的 JWT,因此如果收到相关响应,我需要自动重新进行身份验证。这似乎对 Polly 来说应该是微不足道的,Polly wiki 甚至说这很微不足道,但我无法让它发挥作用。

最终目标是:

  • 如果出现网络问题,重试请求 4 次,间隔 2 秒
  • 如果请求成功并返回一个有效的响应,那么就完全脱离 Polly,因为我们得到了我们需要的东西
  • 如果请求成功但返回 401(意味着我们需要重新认证):
    • 使用保存的凭据并自动重新验证
    • 如果凭据有效,请返回重试网络故障的外部策略
    • 如果凭据无效(身份验证端点返回 401),则中断并注销用户

这是我的代码。如果响应成功,这将正常工作。它还会根据需要重试网络故障。问题是当收到 401 时,该响应总是从策略返回。重新验证被调用并成功返回,但 Polly 在那里中断——原始请求没有重试,并且返回原始 401 响应。

0 投票
2 回答
8555 浏览

c# - 具有功能的 Polly 重试策略不等待结果

我正在尝试将现有功能转换为 Polly Retry 策略

转换成这个

测试代码是

当我断言该res值时,我没有得到正确的结果。调试跟踪我到Execution没有正确等待结果的地方。

调用次数test function正确。但是日志记录混乱,最终结果没有结果fake

0 投票
1 回答
7234 浏览

c# - 在使用 Polly 重试之前检查响应的字符串内容

我正在使用一个非常不稳定的 API。有时我得到500 Server ErrorTimeout,其他时候我也得到500 Server Error了,因为我给了它无法处理的输入SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

这两种情况都给了我HttpRequestException,但我可以查看来自服务器的回复消息并确定异常的原因。如果是超时错误,我应该再试一次。如果输入错误,我应该重新抛出异常,因为再多的重试都无法解决错误数据的问题。

我想对 Polly 做的是在尝试重试之前检查响应消息。但是到目前为止我看到的所有样本都只包含异常类型。

到目前为止,我已经想出了这个:

有没有更好的方法来做这种检查?