【问题标题】:Exception handling in .NET Core API consuming WCF Service使用 WCF 服务的 .NET Core API 中的异常处理
【发布时间】:2021-07-03 15:46:32
【问题描述】:

我在 .NET Core 中创建 API,它使用 WCF 服务。访问 WCF 服务是通过调用任何方法,获取异常(访问被拒绝),然后使用带有第一个调用响应的标头中返回的 cookie 调用 LogIn 方法来实现的。比,登录后我想重试我原来的通话。所有异常都相同,只有消息字符串不同。这是我的一个方法调用的代码:

public async Task<List<scheduleElement>> getSchedule(DateTime start, DateTime end)
{
    bool secondTry = false;

    while (true)
    {

        try
        {

            var data = await _scheduleServiceClient.getScheduleAsync(start, end);

            if (data.@return == null) return new List<scheduleElement>();

            return data.@return.ToList();

        }
        catch (Exception e)
        {
            
            if (!secondTry && e.Message.StartsWith("Access denied for WebService method:"))
            {
                
                var logged = await LogIntoSOAPServices();
                if (!logged) throw;

            }
            else throw;

            secondTry = true;

        }

    }

}

我正在使用 WCF Web 服务参考提供程序生成的代理

这可行,但我正在寻找一种方法来全局处理异常并重试这样的逻辑,因为我将不得不复制和粘贴大量代码。我的 API 中有异常处理程序,但如果我用它捕获此异常,我将无法重试我最初调用的方法。

【问题讨论】:

  • 为什么不每次通话都登录?你每分钟要打多少电话?
  • 我无法登录每个通话,因为会话会持续一个小时左右,并且还与其他应用程序共享,我只想在发生会话时发现会话不足。创建一个。
  • 一小时内你会打多少个电话?
  • 这可能从 1k 调用甚至高达 30k 不等,这真的取决于时间,因此正确处理非常重要

标签: c# api wcf .net-core


【解决方案1】:

Polly 是此类案例的通用库;

https://github.com/App-vNext/Polly

我相信它是 dotnet 基础的一部分,并且非常常用。 您可以处理特定的异常或结果并采取行动,例如

// Retry once
Policy
  .Handle<SomeExceptionType>()
  .Retry()

逻辑可能会变得相当复杂。对于 webApi,我通常遵循 msdn 的本指南:

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly

【讨论】:

  • 这正是我所寻找的。我不敢相信我以前没有找到它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多