使用 WCF 服务的 .NET Core API 中的异常处理

Exception handling in .NET Core API consuming WCF Service

我正在 .NET Core 中创建 API,它使用 WCF 服务。访问 WCF 服务是通过调用任何方法,获取异常(访问被拒绝),而不是使用 header 中返回的 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 中有异常处理程序,但如果我用它捕获此异常,我将无法重试我最初调用的方法。

用于此类情况的通用库是 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