簡體   English   中英

同時調用同一Web服務多次時出現意外結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM