To avoid a similar issue in the past I actually "pinged" the service occasionally (I had control over the service at other end and created a very light-wight "ping" method but even if there is something simple you can use that would not contitute a denial of service!)
I think I pinged every 2 to 5 minutes or so, it would depend on the web service config etc... That way the authentication issue never really happened and I did not need to do the funky auto re-login thing :-)
-- otherwise... --
If you do need to do the re-login I would be wrapping the whole thing in an interface, this is good practice anyway with web-services, can stub them out etc.
Design a class with utility methods to handle the logging in, you will find it hard to get around not re-typing alot of calls but thats just the way it is!
Example....
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 appropriatly...
{
// if its a login error...
if (Login())
_proxy.Method1();
else
throw;
}
return "";
}
public string Method2()
{
try
{
_proxy.Method2();
}
catch (Exception exp) // filter appropriatly...
{
// if its a login error...
if (Login())
_proxy.Method2();
else
throw;
}
return "";
}
protected bool Login()
{
return true; // i.e. success
}
}