C# 如果身份验证失败需要重新登录,请重试web服务调用

C# 如果身份验证失败需要重新登录,请重试web服务调用,c#,web-services,authentication,asmx,C#,Web Services,Authentication,Asmx,我正在使用一个来自C#的web服务,该web服务需要一个登录调用,然后使用cookie会话。web服务将在特定时间段后超时会话,在此时间段后,客户端将不得不重新登录。我想找到一种方法来自动捕获服务在此场景中发回的soap错误,并通过重新登录然后重试以前尝试的调用来处理它 我更愿意为所有有问题的web服务方法自动执行此操作,而不必手动使用重试逻辑包装调用 建议?过去为了避免类似问题,我实际上偶尔会“ping”服务(我在另一端控制了服务,并创建了一个非常轻的“ping”方法,但即使您可以使用一些简单

我正在使用一个来自C#的web服务,该web服务需要一个登录调用,然后使用cookie会话。web服务将在特定时间段后超时会话,在此时间段后,客户端将不得不重新登录。我想找到一种方法来自动捕获服务在此场景中发回的soap错误,并通过重新登录然后重试以前尝试的调用来处理它

我更愿意为所有有问题的web服务方法自动执行此操作,而不必手动使用重试逻辑包装调用


建议?

过去为了避免类似问题,我实际上偶尔会“ping”服务(我在另一端控制了服务,并创建了一个非常轻的“ping”方法,但即使您可以使用一些简单的方法,也不会构成拒绝服务!)

我想我每隔2到5分钟左右Ping一次,这取决于web服务配置等。。。这样,身份验证问题就从未真正发生过,我也不需要再做那种时髦的自动重新登录的事情:-)

--否则--

如果您确实需要重新登录,我会将整个过程包装在一个界面中,这对于web服务来说是一个很好的实践,可以将它们删除,等等。 设计一个带有实用方法的类来处理登录,你会发现如果不重新键入大量调用,很难找到解决方法,但事实就是这样

例如

public interface ISomeService
{
    string Method1();
    string Method2();
}

public class ReLoginWebService : ISomeService
{
    readonly WebServiceProxy _proxy;
    string _username;
    string _password;

    public ReLoginWebService(string username, string password)
    {
        _username = username;
        _password = password;
        _proxy = new WebServiceProxy();
        Login();
    }

    public string Method1()
    {
        try
        {
            _proxy.Method1();
        }
        catch (Exception exp) // filter appropriately...
        {
            // if its a login error...
            if (Login())
                _proxy.Method1();
            else
                throw;
        }
        return "";
    }


    public string Method2()
    {
        try
        {
            _proxy.Method2();
        }
        catch (Exception exp) // filter appropriately...
        {
            // if its a login error...
            if (Login())
                _proxy.Method2();
            else
                throw;
        }
        return "";
    }

    protected bool Login()
    {
        return true; // i.e. success
    }
}

我建议您查看AspectF库,在那里我尝试解决了这些重试问题。你可以做:

AspectF.Define.Retry(() => client.TheRealMethod(), () => login.DoLoginAgain());
看看这一点,它使编码如重试、错误处理、日志记录等变得更干净


什么样的web服务客户端?“添加Web引用”(ASMX)或“添加服务引用”(WCF)?使用WCF客户端会容易得多。这是一个常规的web参考。保罗:是的,“每次都重新输入”正是我试图避免的问题。我已经将web服务本身抽象为客户端代码的接口。我昨天走的是“ping”路线,它看起来像预期的那样工作。这很好,它们可能是相当令人沮丧的错误,需要处理!