2011-05-02 67 views
2

我在C#中使用WCF 4。我正在使用InstanceContextMode設置爲單個。實現我的合約的類的實例是使用構造函數創建的,該構造函數接受託管服務的對象的引用。在創建和託管服務主機時傳遞服務對象。訪問承載服務的對象

服務實現代碼:

[ServiceBehavior(UseSynchronizationContext = false, 
    InstanceContextMode = InstanceContextMode.Single)] 
public class ServiceImpl : IMyContract 
{ 
    private ServiceHoster _sh; 
    ServiceImpl(ServiceHoster sh) 
    { 
     _sh = sh; 
    } 

    public string Call(string input) 
    { 
     ... //Do some processing on the input string 

     return _sh.ProcessCall(string input); 
    } 
} 

ServiceHoster代碼:

public class ServiceHoster 
{ 
    private ServiceImpl ns; 

    ServiceHoster() 
    { 
     ... 
     Start(); 
    } 

    private void Start() 
    { 
     //Host Service 
     ns = new ServiceImpl(this); 

     //Instantiate NetTCP service 
     _tcpServiceHost = new ServiceHost(ns, new Uri("net.tcp://localhost:8089")); 
     _tcpServiceHost.Open(); 
    } 

    private void Stop() 
    { 
     if(ns != null && ns.State == CommunicationState.Opened) 
     ns.Close(); 
    } 

    public string ProcessCall(string input) 
    { 
     ... 
     return result; 
    } 
} 

說我現在面臨的問題是,我們需要客戶端和服務器之間的雙向通信。對於雙工連接,我們需要設置InstanceContextMode設置爲PerSession

我的問題是:

  1. 我可以使用多個值 InstanceContextMode一些如何(我認爲這 是不可能的)?

  2. 是否有任何其他方法可以讓ServiceImpl 對象獲得託管它的對象的參考 ?

  3. 有什麼我可以做的 不同來解決問題?

謝謝。

+0

有沒有實現在應用程序中單獨服務的特定需求?單身WCF服務很少有很好的用例。如果這是一個問題,這個實現幾乎可以殺死服務可伸縮性。 – 2011-05-02 13:54:55

+0

是的,serviceImpl對象需要引用承載該服務的ServiceHoster對象。你能指引我提到你提到的用例嗎?謝謝。 – sunilkumarba 2011-05-06 11:00:03

+0

下面的鏈接提供了有效使用WCF中單例的最佳總結。如果你沒有在接受的答案中列出任何東西,你應該使用像wsDualHttpBinding這樣的綁定或其他任何支持雙工通信的綁定。鏈接:http://stackoverflow.com/questions/1756487/should-wcf-service-typically-be-singleton-or-not – 2011-05-06 13:19:07

回答

1

首先,我不認爲你需要對你的InstanceContextMode做任何事情。有關如何保存已連接客戶端列表的更多信息,請參閱此MSDN/WCF論壇主題:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/463dd4a2-f9db-4773-b373-7dd470e65f90/

如果您仍然想這樣做,我會建議您實施一個實例提供程序(通過實施IInstanceProvider實例並將其插入到ServiceHost中,並選擇一種行爲。)

如果您是Google for IInstanceProvider,您將找到關於如何完成的示例 - 如果您使用IoC容器,則很可能會找到WCF集成它就是這樣工作的。

+0

我會試一試,稍後可能會發布代碼。感謝您的建議。 – sunilkumarba 2011-05-05 17:55:31

+0

第一個鏈接適用於我。謝謝 – sunilkumarba 2012-02-21 18:19:37

0

獲取到的ServiceHost參考像這樣的當前請求:

OperationContext.Current.Host 
+0

我不需要訪問ServiceHost對象。相反,我試圖訪問通過其創建和託管ServiceHost的對象。嘗試訪問ServiceImpl對象內的ServiceHoster對象 – sunilkumarba 2011-05-05 17:53:23