2011-11-25 53 views
2

我试图访问一个有一个怪癖的Web服务。看起来,如果你做了太多的请求(我猜测每秒钟超过一次或两次),最终会出现错误503.如果你在几秒钟后重试,那么一切都很好。当太频繁的请求时,THTTPRIO,SOAP和错误503

现在,我的问题是,我正在使用Delphi来使用此服务。生成的文件将通信部分抽象出来 - 所以我试图为这个节流问题提出一个简洁的解决方案。目前我正在诉诸sleep()之间的电话......

有没有人有过类似的问题?是否有全局挂钩或设置在成功请求后添加一些冷静期?

+0

它可能是一个WinInet问题?我注意到WinInet有一些奇怪的问题。你安装了哪个版本的Internet Explorer,以及什么操作系统?您是否在Internet Explorer选项页面中配置了任何代理?你在做什么认证(Http/https/basic/digest/etc) –

+1

可能是服务器有一些内部问题?你是否运行来自不同线程的多个请求? 503可能是由于太多的流量或谁知道服务器端发生了什么...更多信息将是有益的。 – ComputerSaysNo

+0

服务不在我的控制之下(这是电子发票,服务器来自税务部门。)我猜测他们确实是为了避免太多请求而采取某种形式的限制。我已经使用SoapUI重现了这个问题,所以我不认为这是一个WinInet问题。 –

回答

1

要想处理类似503的临时错误,消息处理队列可以使用递增延迟时间,失败的请求将增加等待时间(达到定义的最大值)。如果请求成功,则重置延迟。

因此,我会以500毫秒的间隔开始。每次请求失败时,间隔将乘以2,最大延迟时间为16秒。如果请求没有错误地返回,则间隔将被重置为其初始值500毫秒。

+0

有趣的是,这就是我所拥有的(我等待'NumTries * WaitInterval') –

1

TTimer怎么样?这样,您的应用程序就不会被sleep()调用锁定。

+0

嗯,我并不太在意使用的实际机制,但我想以一种干净的方式来完成。我更担心的是用停止标志喷洒我的代码...... –

2

定义:http状态码503:服务不可用。服务器当前不可用(因为它过载或因维护而关闭)。一般来说,这是一个暂时的状态。

由于500-599在Web服务或Web站点上出现服务器端错误,一直发生。对于503来说,减慢来自客户端程序的请求频率是一个好方法,而且如果您的客户端程序具有GUI>

+0

是的,这是我正在尝试做的。我必须使用多种Web服务,而且我无法预测工作量,所以我想要一个很好的集中方式来限制我的输出。我甚至想到一个事件队列...... –

0

我在回答我自己的问题。我不会接受它,因为这只是在概念阶段。

我想我会为所有对属于我的提供者的服务的调用创建一个通用堆栈。每次打电话时,我都会使用某种形式的线程或计时器来设置“降温”时间(我试图用这个作为借口,在我的应用程序中包含gabrOmniThread库)。因此,如果在冷却期间提交了两个或更多请求,我可以链接它们并向用户显示一些花哨的(*)用户界面以避免事件中断。

如果有人有更好的选择,我全部耳朵。

(*):当然是带进度条的对话框。

相关问题