2011-02-16 80 views
10

你好,我有一個簡單的wcf服務就像這樣,一個簡單的睡眠20秒並返回一個值的測試方法。我寫了一個測試頁面,它使用jquery連續調用它10次,它似乎是同時執行的,客戶端等待20秒,然後幾乎同時從所有服務中獲取結果。AspNetCompatibilityRequirements導致WCF網絡服務阻止

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)] 
public class AjaxTestWCFService : IAjaxTestWCFService 

但是如果我設置

aspNetCompatibilityEnabled="true" 

在web.config中那麼無論我做什麼,與concurrencymode, usesynchronizationcontext或實例上下文模式,甚至serviceThrottling配置,它似乎執行每個Web服務調用順序,需要2分鐘才能返回所有10個請求!

現在我意識到這可能是因爲會話,但至少在ASMX服務中,我能夠將enablesession設置爲false。事實上,我的Web服務方法根本不使用會話。所以你可能會想,爲什麼要使用aspNetCompatibilityEnabled。因爲我想使用ASP.net模擬和表單身份驗證。

我甚至設置

[ServiceContract(SessionMode=SessionMode.NotAllowed)] 

所以我的問題是,這是由設計,我如何能實現與ASP.net兼容性併發Web服務請求啓用?

回答

6

這是由ASP.NET本身的設計 - 檢查concurrent requests and session state。一旦你打開AspNetCompatibilityEnabled你總是要處理 - 我沒有嘗試,但我期望唯一的選擇可以關閉配置文件中的會話。

<configuration> 
    <system.web> 
    <sessionState mode="Off" /> 
    </system.web> 
</configuration> 

但是你的測試可能不是很現實。當AspNetCompatibilityEnabled關閉時,它將在本地並行執行,但我期望如果從不同的計算機運行該頁面,則無法並行執行多於兩個的請求。原因是默認使用HTTP持久連接。通過HTTP規範,只能向同一臺服務器打開兩個HTTP持久連接=只能執行兩個並行請求(last paragraph before chapter 8.2)。 Windows遵循這些建議。

編輯:

thread on MSDN forum disusses同樣的問題。它也提供了一些解決方案。

+0

實際上是IE 8. Safari和FireFox可以對同一臺服務器執行2個以上的請求。我相信IE 8是6.是的,我從另一臺機器確認。 – Tuviah 2011-02-16 23:53:20