[英]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.