WebServiceExtensions
using Microsoft.VisualBasic.CompilerServices;
using Relativity.DataExchange;
using Relativity.DataExchange.Logger;
using Relativity.Logging;
using System;
using System.Web.Services.Protocols;
namespace kCura.WinEDDS.Service
{
[StandardModule]
public sealed class WebServiceExtensions
{
private static ILog _logger = RelativityLogger.Instance;
public static T RetryOnReLoginException<T>(this SoapHttpClientProtocol input, Func<T> serviceCall, bool retryOnFailure = true)
{
int num = 0;
while (num < AppSettings.Instance.MaxReloginTries) {
num = checked(num + 1);
try {
return serviceCall();
} catch (Exception ex) {
ProjectData.SetProjectError(ex);
Exception ex2 = ex;
LogFailedServiceCall(ex2, num, retryOnFailure);
if (!retryOnFailure || !(ex2 is SoapException) || ex2.ToString().IndexOf("NeedToReLoginException") == -1 || num >= AppSettings.Instance.MaxReloginTries) {
LogFailedExceptionCheck(ex2);
throw;
}
LogAttemptReLogin(ex2);
try {
Helper.AttemptReLogin(input.get_Credentials(), input.get_CookieContainer(), num, false);
} catch (Exception ex3) {
ProjectData.SetProjectError(ex3);
Exception exception = ex3;
LogFailedAttemptReLogin(exception);
ProjectData.ClearProjectError();
}
ProjectData.ClearProjectError();
}
}
return default(T);
}
public static void RetryOnReLoginException(this SoapHttpClientProtocol input, Action serviceCall, bool retryOnFailure = true)
{
int num = 0;
while (num < AppSettings.Instance.MaxReloginTries) {
num = checked(num + 1);
try {
serviceCall();
return;
} catch (Exception ex) {
ProjectData.SetProjectError(ex);
Exception ex2 = ex;
LogFailedServiceCall(ex2, num, retryOnFailure);
if (!retryOnFailure || !(ex2 is SoapException) || ex2.ToString().IndexOf("NeedToReLoginException") == -1 || num >= AppSettings.Instance.MaxReloginTries) {
LogFailedExceptionCheck(ex2);
throw;
}
LogAttemptReLogin(ex2);
try {
Helper.AttemptReLogin(input.get_Credentials(), input.get_CookieContainer(), num, false);
} catch (Exception ex3) {
ProjectData.SetProjectError(ex3);
Exception exception = ex3;
LogFailedAttemptReLogin(exception);
ProjectData.ClearProjectError();
}
ProjectData.ClearProjectError();
}
}
}
private static void LogFailedServiceCall(Exception exception, int tries, bool retryOnFailure)
{
int maxReloginTries = AppSettings.Instance.MaxReloginTries;
string authenticationToken = Settings.AuthenticationToken;
string str = "An error occurred when retrying on a re-login exception";
if (retryOnFailure)
_logger.LogError(exception, str + " Currently on attempt {tries} out of {maxRetries}, using token {token}", new object[3] {
tries,
maxReloginTries,
authenticationToken.Secure()
});
else
_logger.LogError(exception, str + " Will not retry, using token {token}", new object[1] {
authenticationToken.Secure()
});
}
private static void LogAttemptReLogin(Exception exception)
{
_logger.LogError(exception, "Attempting re-login", new object[0]);
}
private static void LogFailedExceptionCheck(Exception exception)
{
_logger.LogError(exception, "Will not attempt to retry", new object[0]);
}
private static void LogFailedAttemptReLogin(Exception exception)
{
_logger.LogError(exception, "Failed to log in the user", new object[0]);
}
}
}