[英]Unexpected result when calling the same web service multiple times simultaneously
同时向同一Web服务操作(即,在多个线程中)发出多个请求时出现问题。
每次调用Web服务时,都会将其记录到控制台,因此输出类似于
Calling OperationA with paramA = 'A'
Calling OperationA with paramA = 'B'
Calling OperationA with paramA = 'C'
Calling OperationA with paramA = 'D'
...
Calling OperationA with paramA = 'Z'
这表明我正在使用不同的参数调用同一操作。
我正在使用Fiddler来跟踪这些请求,我希望可以按照在应用程序上发出的顺序查看所有请求。 但这全都错了:请求全部乱了,有些请求发出了不止一次,有些根本没有发出(也就是说,我的printf说我叫了它,但是Fiddler没有显示任何东西)。
似乎问题在于在短时间内发出了很多请求,因为如果我在每次调用之间放置Thread.Sleep(2000)
,那么一切都会像个符咒。
这是某种预期的行为吗? 为什么请求没有正确排队?
" and "end " methods in the proxy class to issue the requests. 顺便说一句,这是一个C#2.0客户端,它使用wsdl.exe生成的代理类来调用AXIS 2.0安全Web服务,而我正在代理类中使用异步的“开始 ”和“结束 ”方法来发出请求。
编辑:这就是我如何反复调用此操作的方式:
foreach(List listOfMyClass1 in listOfListOfMyClass1)
{
MyClass2[] webServiceParameter = listOfMyClass1.ToArray();
// Here I log that I'm calling the operation, and print every element in webServiceParameter
IAsyncResult ar = wsClient.BeginOperationA(webServiceParameter);
listOfAsyncResults.Add(ar);
// System.Threading.Thread.Sleep(2000); --> This solves the problem..
}
foreach(IAsyncResult ar in listOfAsyncResults)
{
WebServiceResultClass result = wsClient.EndOperationA(ar);
}
我不希望它们以任何特定的顺序出现,但是每个只能出现一次。
我将使用心理调试来尝试找出问题所在……我怀疑您有这样的循环:
foreach (string input in data)
{
new Thread(() => CallWebService(input)).Start();
}
这是在捕获循环变量-这是一个坏主意 。 修复起来很容易:
foreach (string input in data)
{
string copy = input;
new Thread(() => CallWebService(copy)).Start();
}
(上一个链接将解释发生了什么……, 这是第二部分 。)
如果不是这种情况,请给我们一些代码-否则我们只是在猜测。
好的,所以问题就出在原来的问题上:在每次迭代时更改在循环外部声明的变量,然后在循环内部使用它。 我的意思是,这有点类似于:
MyClass c = new MyClass();
IList<MyClass>
myClassList = new List<MyClass>
();
for(int i = 0; i < someInt; i++)
{
c.SomeProperty = i;
myClassList.Add(c);
}
// And here every "SomeProperty" is the same for every element in the list, since every element references the same variable.
更具体地说,实际上将webServiceParameter
数组(请参见问题中的代码)分配给另一个变量的属性(该变量在循环外部声明),并将此变量传递给服务调用。
因此,当非常快地进行太多调用时,在调度这些调用时,数组将包含上次迭代的值,从而导致“重复请求”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.