网站title的作用,电子商务的网站建设过程,网站备案关闭网站,目前做公司网站有没有用前言#xff1a;最近#xff0c;同事在工作中遇到了使用HttpClient,有些请求超时的问题#xff0c;辅导员让我下去调研一下#xff0c;HttpClinet的使用方式已经改成了之前博客中提到的方式#xff0c;问题的原因我已经找到了#xff0c;就是因为使用了伪异步#xff0c… 前言最近同事在工作中遇到了使用HttpClient,有些请求超时的问题辅导员让我下去调研一下HttpClinet的使用方式已经改成了之前博客中提到的方式问题的原因我已经找到了就是因为使用了伪异步导致阻塞主线程。在之前的博客中有园友建议在使用静态的HttpClinet时务必使用它的Async方法所以就得从头到尾异步化。这一点在之前的文章中没有提这里作为补充也感谢这位园友。关于怎么使用异步编程在这里我就不聊了大家可以看看其他的博客看完公司的代码之后我想强调的是在使用异步编程的时候关于返回值的问题为什么async方法返回的通常都是Task或者TaskT而不是T本身这是因为Task和TaskT代表着在将来某一个时刻将会返回T类型的结果。因此在主线程调用HttpPostWhitStrBody时实际上你拿到的是一个未来才会发生的预期也就是未来的某一个时间会得到一个string的结果。如果返回的是一个T本身那么在主线程调用时就会因为访问这个需要一段时间才能给出结果从而阻塞了主线程。因此如果async方法有返回值应返回TaskT。如果没有返回值应该返回Task。大家如果不太明白的话建议多了解一下C#中的异步编程。好了前戏太多了下面就来聊聊如何集成Polly。 一、在异步编程中如何处理异常信息在聊如何集成Polly前我们先来看看在异步编程中如何处理异常。当异步操作发生异常的时候异常会停留在异步方法中调用方法无法直接看到因此我们应该异步方法中处理异常而不是在调用方法中处理异常。如果我们使用了await修饰了任务那么只需要为它包上一层try-catch就可以了。当然了也可以在调用方法比如Main方法中捕捉异常这就需要异常从异步方法中传播给调用方法。做到这件事是很容易的只需要两个条件1调用方法本身也是async的并且在内部调用异步方法并使用await。2异步方法返回Task或者TaskT因为C#不允许在Main方法中使用async在C#7.1中可以使用async修饰Main方法了因此我们不得不再创建一层方法下面通过代码演示一下。一般在处理异常的时候我们都是采用 try-catch来做处理的若我们想重试三次此时我们只能进行循环三次操作。我们只能简单进行处理自从有了Polly什么重试机制超时都不在话下下面把话题转向Polly。在聊下面的话题时建议大家先认真阅读一下这篇博客因为博主讲的非常细致Polly 二、集成Polly处理HTTP请求过程中的瞬时故障 Polly是一种流行的瞬态故障处理库它提供了一种机制来定义可在某些故障发生时应用的策略。 最常用的策略之一就是重试策略。 这中策略允许您包装一些代码如果发生故障将重试这些代码; 必要时也可以重试多次。 这在您的应用程序需要与外部服务通信的情况下非常有用。 当通过HTTP与服务进行通信时会出现瞬态故障这种风险始终存在。 瞬态故障可能会阻碍您的请求完成但是瞬态故障也可能是暂时性的问题。因此 这使得在这些情况下重试成为明智的选择。 除了重试之外Polly还提供了许多其他类型的策略其中许多策略可能需要与重试相结合以构建处理故障的复杂方法。 我将在本文中介绍一些更一般的例子但是如果你想要更全面的了解我建议你查看一下Polly wiki。 使用Polly ASP.NET团队与Polly的主要维护者Dylan和Joel密切合作使得将Polly策略应用于HttpClient实例非常简单。在开始之前我们先引用下面的两个包 这个Microsoft.Extensions.Http.Polly包在IHttpClientBuilder上包含一个名为AddPolicyHandler的扩展方法我们可以使用它来添加一个handler 该handler 将使用一个Polly实例来包装请求。 我们可以用这个扩展在我们的ConfigureServices 方法中代码如下 services.AddHttpClient(github).AddPolicyHandler(Policy.TimeoutAsyncHttpResponseMessage(TimeSpan.FromSeconds(10))); 在这个例子中我们定义了一个名字为“github”的客户端并且我们使用AddPolicyHandler 方法来添加了一种处理超时的策略这里提供的超时策略必须是IAsyncPolicyHttpResponseMessage这个中策略在任何请求超过10s都会触发。 重试策略 如果可能的话当我们在使用Polly时最好的尝试是定义一次策略并在应用相同策略的情况下共享它们这样要更改策略只需在一个位置进行更改。此外它还确保仅分配策略一次。当然了如果多个使用者希望通过相同的断路器实例运行则需要共享诸如断路器之类的策略。不太理解不要紧下面看代码体会一下。 瞬时错误处理 处理HTTP请求时我们要处理的最常的问题就是瞬态故障。 由于这是一个常见的要求Microsoft.Extensions.Http.Polly软件包中包含一个特定的扩展我们可以使用它来快速设置处理瞬时故障的策略。例如要在指定客户端的请求发生瞬时故障时添加基本重试我们可以按如下方式注册重试策略services.AddHttpClient(github).AddTransientHttpErrorPolicy(p p.RetryAsync(3)); 代码的含义是所以使用命名的HttpClient发出的请求只要遇到错误就会重试三次。这个AddTransientHttpErrorPolicy 方法需要一个FuncPolicyBuilderHttpResponseMessage, IAsyncPolicyHttpResponseMessage.类型的参数。此处的PolicyBuilder将预先配置为处理HttpRequestExceptions任何返回5xx状态代码的响应以及具有408请求超时状态代码的任何响应。 这应该适用于许多情况。 如果您要求在其他条件下应用策略则需要使用不同的重载来传递更具体的策略。 我们需要意识到 在进行重试时我们需要考虑幂等性。 重试HTTP GET是一种非常安全的操作。因为HTTP GET本身就是幂等性的 如果我们调用一个方法但没有收到任何响应我们可以安全地重试调用而不会有任何危险。 但是请考虑如果我们重试HTTP POST请求会发生什么 在这种情况下我们必须更加小心因为您的原始请求可能实际收到但我们收到的响应却显示失败。 在这种情况下重试可能导致数据重复或下游系统中存储的数据损坏。 在这里您需要更多地了解下游服务在多次收到相同请求时将执行的操作。 重试是一种安全操作 当您拥有下游服务时更容易控制它。 例如您可以使用一些唯一标识符来防止重复的POST。 如果您对下游系统的控制较少或者您知道重复的POST可能会产生负面影响则需要更仔细地控制策略。 可能适合的做法是定义不同的命名/类型客户端。 您可以为那些没有副作用的请求创建一个而为那些有副作用的请求创建另一个。 然后您可以使用正确的客户端进行操作。 但是这可能会变得有点难以管理。 更好的选择是使用AddPolicyHandler的重载它允许我们访问HttpRequestMessage以便可以有条件地应用策略。 那个重载看起来像这样AddPolicyHandler(FuncHttpRequestMessage, IAsyncPolicyHttpResponseMessage policySelector)您将注意到此处的policySelector委托可以访问HttpRequestMessage并且应该返回IAsyncPolicy HttpResponseMessage。 我们无法访问PolicyBuilder设置来处理瞬态错误就像我们在前面的示例中所做的那样。 如果我们想要处理常见的瞬态错误我们需要为我们的策略定义预期条件。 为了简化这一过程Polly项目包含一个帮助扩展我们可以使用它来设置一个准备好处理常见瞬态错误的PolicyBuilder。 要使用扩展方法我们需要从Nuget添加Polly.Extensions.Http包。 然后我们可以调用HttpPolicyExtensions.HandleTranisentHttpError来获取配置瞬态故障条件的PolicyBuilder。 我们可以使用该PolicyBuilder创建一个合适的重试策略当请求是HTTP GET时可以有条件地应用该策略。 在此示例中任何其他HTTP方法都使用NoOp策略。 使用PolicyRegistry 我想在本文中介绍的最后一个示例是如何从策略注册表中应用策略。 为了支持策略重用Polly提供了PolicyRegistry的概念PolicyRegistry本质上是策略的容器。 这些可以在应用程序启动时通过向注册表添加策略来定义。 然后可以传递注册表并用于按名称访问策略。IHttpClientBuilder上可用的扩展还支持使用注册表将基于Polly的处理程序添加到客户端。 首先我们必须在DI中注册PolicyRegistry。 Microsoft.Extensions.Http.Polly包中包含一些扩展方法以简化此操作。 在上面的示例中我调用AddPolicyRegistry方法该方法是IServiceCollection的扩展。 这将创建一个新的PolicyRegistry并在DI中添加注册作为IPolicyRegistry string和IReadOnlyPolicyRegistry string的实现。 该方法返回策略以便我们有权向其添加策略。 在此示例中我们添加了两个超时策略并为其指定了名称。 现在在注册客户端时我们可以调用IHttpClientBuilder上的AddPolicyHandlerFromRegistry方法。 这将采用我们想要使用的策略的名称。 当工厂创建此命名客户端的实例时它将添加适当的处理程序在“regular”重试策略中包含调用该策略将从注册表中检索。 示例项目新建一个.Net Core 2.1的webapi项目Startup.cs文件的代码注意WaitAndRetryAsync参数的意思是每次重试时等待的睡眠持续时间。ValuesController的代码看到没它在重试。 更多的Polly和HttpClinetFactory的集成使用请参考https://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactoryhttps://www.hanselman.com/blog/AddingResilienceAndTransientFaultHandlingToYourNETCoreHttpClientWithPolly.aspx 三、总结 注意AddTransientHttpErrorPolicy方法会自动帮我们处理以下错误 1Network failures (System.Net.Http.HttpRequestException) 2HTTP 5XX status codes (server errors) 3HTTP 408 status code (request timeout) 通过这些库您可以轻松地启动并运行能够无缝处理瞬态故障的HttpClient实例。 有关更详细的Polly文档和示例建议您查看Polly wiki。这里只是聊了关于HttpClientFactory中集成Polly的基础用法关于更详细的使用请参考https://www.cnblogs.com/CreateMyself/p/7589397.html好了今天就聊到这里该系列文章还有最后一篇对于Polly我也是刚接触至于项目中是否使用还要经过辅导员的审核希望对你有帮助谢谢。 参考文章翻译https://www.stevejgordon.co.uk/httpclientfactory-using-polly-for-transient-fault-handling相关文章ASP.Net Core2.1中的HttpClientFactory系列一HttpClient的缺陷.NET Core 中正确使用 HttpClient 的姿势AspNetCore 基于AOP实现Polly的使用使用.NetCore 控制台演示 熔断 降级polly.NET Core微服务之基于PollyAspectCore实现熔断与降级机制再探Circuit Breaker之使用Polly开源服务容错处理库Polly使用文档Polly组件对微服务场景的价值原文地址:https://www.cnblogs.com/runningsmallguo/p/9692001.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com