[英]Are WebServices asynch/synch on .NET?
我從客戶端調用了30次WebService方法(asmx):
for (var i = 0; i < 30; i++) {
WSCustom.Test(i,
function (res) {
$("#Results").append(res + "<br />");
},
function (res) {
$("#Results").append(res.get_message() + "<br />");
}
);
}
這是WebService方法:
[WebMethod(EnableSession = true)]
public string Test(int i)
{
DateTime m_oStart = DateTime.Now;
WebClient m_oClient = new WebClient();
if (i % 2 == 0)
{
byte[] res = m_oClient.DownloadData("http://www.repubblica.it/");
}
return String.Format("TotalSeconds:{0}", new string[] { DateTime.Now.Subtract(m_oStart).TotalSeconds.ToString() });
}
我所關心的是異步回復。
我的意思是,我應該得到立刻回復15(奇數i
就立刻返回),並在時間回復的休息(這需要時間來下載頁面服務器端)。
但是實際上,輸出是不同的:它立即處理第一個呼叫。 比,它等待第二完畢,比我得到一些奇怪的i
回復,等等。
因此,它根本不算緊。
WebServices如何管理.NET中的客戶端調用? 我可以在整個過程中進行緊急處理嗎?
如果EnableSession = false
則結果如下:
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:1,514
TotalSeconds:0
TotalSeconds:1,857
TotalSeconds:0
TotalSeconds:2,143
TotalSeconds:0
TotalSeconds:1,88
TotalSeconds:0
TotalSeconds:3,178
TotalSeconds:0
TotalSeconds:3,562
TotalSeconds:2,095
TotalSeconds:0
TotalSeconds:0
TotalSeconds:4,221
TotalSeconds:1,749
TotalSeconds:0
TotalSeconds:0
TotalSeconds:3,717
TotalSeconds:0
TotalSeconds:1,977
TotalSeconds:2,421
TotalSeconds:2,439
TotalSeconds:1,807
TotalSeconds:2,124
因此這不是會話錯誤。
您的網絡方法上具有EnableSession=true
。 這實際上將使呼叫排隊,因為會話對象將針對每個請求被鎖定。
如果不使用會話,則不應啟用它。
從http://msdn.microsoft.com/en-us/library/aa478952.aspx :
為了提供GetItemExclusive所需的排他性,會話狀態提供程序必須實現一種鎖定機制,以防止給定會話被兩個或多個需要對會話狀態進行讀/寫訪問的並發請求訪問。 該機制通過防止並發請求覆蓋彼此的更改來確保會話狀態的一致性。 即使會話狀態數據源是由多個Web服務器共享的遠程資源,鎖定機制也必須起作用。
它是異步的,因為該方法不會在javascript中阻塞,而是在操作完成后觸發回調。
它可以並行化也可以不並行化 ,這與異步化不同。
請注意,大多數瀏覽器都會限制並發AJAX請求的數量。 您當然不能一次發送30個請求。 通常您只會看到1-3個左右的數字。 這就是為什么您通常會看到所有請求的順序,而不是所有請求都在同一時間返回。
WebService是由defualt按線程分類的。 如果遇到問題,請嘗試在連接字符串中插入Pool Size = 10或更大,請注意,如果您使用一種通用對象,請注意:
lock (myObjList)
{
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.