2009-06-17 76 views
4

我有我使用,以取代舊的ASP.NET Web服務的WCF服務。該服務似乎工作正常,但由於某種原因無法處理同時發生的請求。我服務的實施具有以下屬性:爲什麼我的Winforms託管WCF服務單線程?

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class HHService : IHHService 

我的主機聲明如下所示:

baseAddress = new Uri("http://0.0.0.0:8888/HandHeld/"); 
host = new ServiceHost(typeof(HHService), baseAddress); 

ServiceMetadataBehavior behavior; 
behavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
if (behavior == null) 
{ 
    behavior = new ServiceMetadataBehavior(); 
    behavior.HttpGetEnabled = true; 
    behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
    host.Description.Behaviors.Add(behavior); 
} 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 
host.AddServiceEndpoint(typeof(IHHService), new BasicHttpBinding(), "HHService.asmx"); 
HHService.LogMessage += new EventHandler<HHService.LogMessageEventArgs>(HHService_LogMessage); 
host.Open(); 

服務運行並返回正確的結果,但如果兩個客戶端試圖使在一個呼叫同時一個客戶端將阻塞,直到另一個客戶端完成,而不是一起執行的呼叫。我沒有使用任何配置文件。我試圖以編程方式做所有事情。我是否有不正確的設置導致此行爲?我已經使用NetTCPBinding運行其他服務而沒有這個問題。

編輯: 針對約翰·桑德斯: 我不熟悉任何ASP.NET兼容模式。我沒有使用任何會話狀態服務是無狀態的,它只是處理請求。除了實際方法的實現之外,我所做的其他一切都在這裏列出的代碼中。

可能的解決方案:

我打電話從主窗體的Form_Load事件的host.Open()功能。我將呼叫轉移到單獨的線程。所有這些線程都是打電話給host.Open(),但現在這個服務看起來像我所期望的那樣。

回答

4

如果您的實例上下文模式是PerCall,那麼你的服務器總是單線程的,因爲根據定義,每個調用得到一個新的服務器實例。

這適用於IIS環境好,在那裏IIS可以旋轉起來幾個服務器實例來處理N個併發呼叫者,每一個都作爲每個傳入請求單線程服務器。

你在其中一條評論中提到了你的WCF在一個表單應用程序內託管 - 這可能是一個需要重新考慮的設計決定 - 這不是最佳選擇,因爲Winforms應用程序無法輕鬆處理多個調用者並旋轉了幾個服務代碼的實例。

馬克

+0

請在我的編輯來看看,因爲我沒有得到它做工精細未做比我提到的其他任何更改。我不確定它爲什麼會起作用。 – Mykroft 2009-06-17 19:31:25

0

是否有鎖定在某處你的服務功能?

+0

沒有沒有鎖定。 – Mykroft 2009-06-17 14:16:13

0

您是否使用ASP.NET兼容模式?會話狀態?


我的下一個問題是:是什麼讓你覺得它是單線程?你是如何確定的,以及你用什麼測試來證明你沒有解決問題?可能是誤報。