如果客户端调用一个方法,而丢失了服务器的响应,那么重新调用这个方法是不合适的。比如说,如果向服务器发送一个采购大量木材的订单,服务器已经介绍到这个请求并且进行了处理,但是客户机却丢失了服务器返回的响应,那么客户端重新尝试调用这个方式是不允许的。
-----------
但是在web service的体系结构中如何避免呢?
这是目前WebService的主要问题之一,还没有标准的解决方法。
先要在Soap上面实现Route和Transaction支持,然后才有Reliable Message。
如果要自己实现的话可以参考这个:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexxml/html/xml11192001.asp
一个有效的模型可以这样:
function Post(mypostinfo)
{
done=false;
try
{
ID=SoapClient.Start_Post("postwhat")
SoapClient.Do_Post(mypostinfo,ID)
}catch(x){
//无论情况怎么样,申请无效的。
//重复这个过程,得到新的ID,重新发一次。
}
do
{
try
{
if(SoapClient.End_Post(ID))
{
done=true
break;
}
}
catch(x)
{
//这里不同,可能定单已经生成了。
//Cllient应该把ID保留。。那样可以下次查询
}
if(not_support_save)//如果没有办法保存了,放弃了。
{
break;
}
save(ID)
//这里要么确定是否重发,什么其他东西的。。。
//或者break;
}while(1)
return done;
}
Post(mypostinfo)
以后重复这个,一直到不想理会这个帐单为止:
if(done==false)
{
//那么没有办法了,只能:
haveDone=false
coll=SoapClient.EnumMyPost()
for(i=0;i<coll.length;i++)
{
postinfo=coll.item(i)
if(CheckIsEqual(postinfo,mypostinfo))
{
haveDone=true
break
}
}
if(!havedone)Post(mypostinfo)
}