我正在使用C#的Web服务,并且Web服务需要登录调用,然后使用cookie会话。 Web服务将在特定时间段之后超时会话,之后客户端将不得不重新登录。我想找到一种方法来自动捕获服务在此场景中发回的soap故障,并通过重新登录然后重试之前尝试的呼叫来处理它。
我更愿意以某种方式自动为所讨论的所有Web服务方法执行此操作,而不必使用重试逻辑手动包装调用。
建议?
答案 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());
看看这个,它使编码重试,错误处理,记录等更清洁。