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

时间:2010-03-26 01:29:05

标签: c# web-services authentication asmx

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

我更愿意以某种方式自动为所讨论的所有Web服务方法执行此操作,而不必使用重试逻辑手动包装调用。

建议?

2 个答案:

答案 0 :(得分:2)

为了避免过去出现类似的问题,我偶尔会对服务进行“ping”(我在另一端控制了服务并创建了一个非常轻微的“ping”方法,但即使有一些简单的东西你也可以使用这不会构成拒绝服务!)

我认为我每隔2到5分钟就会收缩一次,这取决于网络服务配置等...这样的身份验证问题从未真正发生过,我不需要做那个时髦的自动重新登录的事情: - )

- 否则...... -

如果你确实需要重新登录,我会将整个事情包装在一个界面中,无论如何,这是一个很好的做法,使用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
    }
}

答案 1 :(得分:0)

我建议查看我尝试解决此类重试问题的AspectF库。你可以这样做:

AspectF.Define.Retry(() => client.TheRealMethod(), () => login.DoLoginAgain());

看看这个,它使编码重试,错误处理,记录等更清洁。

http://www.codeproject.com/KB/library/DotNetMQ.aspx