我遇到了一个SOAP WebServer的问题:如果我在服务器上有一个方法需要几秒钟才能得到一个结果,而且我不能进行两次以上的调用"同时" (从线程调用)来自我的客户端应用程序(在Delphi中开发) - 仅用于测试,最终的客户端应用程序将基于Web。我的意思是线程以某种方式被序列化,我不知道它是否应该发生这样或者我做错了什么,或者我是否需要进行某种设置。
Delphi XE2 Professional,Windows 7 64位
链接到我的压缩项目: http://1drv.ms/Nwu9nY
服务器方法:
function TServiciu.Test: string;
var t0, t1, Duration : Cardinal;
Guid : tguid;
RGuid : HRESULT;
received : boolean;
const MaxTime : Cardinal = 3000;
begin
Result := '';
RGuid := CreateGuid(Guid);
if RGuid = S_OK then
Result := GuidToString(Guid);
t0 := GetTickCount;
t1 := GetTickCount;
duration := t1 - t0;
while (Duration < Maxtime) do begin
//waiting for something to be written in a db by another program
//I am doing querys to the database for that result
if received then begin
Result := Result + '_RECEIVED_' + DateTimeToStr(Now);
Break;
end;
t1 := GetTickCount;
duration := t1 - t0;
if duration > Maxtime then begin //MaxTime allowed is exceded
Result := Result + '_NOTRECEIVED_' + DateTimeToStr(Now);
Break;
end;
end;
end;
客户端程序执行我的主题:
procedure TThreadTest.Execute;
begin
try
// OleCheck will raise an error if the call fails
OleCheck(CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY));
try
s := 'Calling Method Test; Result=' +
Self.ThGetService.Test;
Synchronize(self.ScrieRezultat); //write result in memo
finally
CoUninitialize;
FreeAndNil(self.ThHttprio);
end;
except
// We failed, do something
end;
end;
答案 0 :(得分:1)
我能够毫无困难地处理40个并发呼叫(实际上不止于此),但我正在使用不同的方法。我的服务是CGI可执行文件,因此IIS管理连接。发出SOAP请求时,IIS会调出myapp_cgi.exe的新实例来处理请求。我在40 TPS时达到顶峰,但我在4台服务器上实现了负载均衡,因此我可以实际完成160 TPS,如有必要可以全天持续。
答案 1 :(得分:1)
您好我解决了我的问题,这件事非常愚蠢,我的服务器设置为HTTP 1.1。 与单个HTTP 1.1服务器的连接仅限于两个同时连接。 http://support2.microsoft.com/kb/183110
答案 2 :(得分:0)
我遇到了一个非常类似的问题,我非常确定您的问题出在您的客户端,而不是您的服务器上。 见this topic here.