使用 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 中的指南:
我正在 .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 中的指南: