2012-06-21 21 views
2

我有一個使用MSMQ託管在IIS上的WCF服務。我想創建一個Windows應用程序,它可以阻止WCF服務選擇MSMQ消息。一旦我看到隊列中的MSMQ消息,我需要單擊一個按鈕並啓動WCF服務以在MSMQ中選擇消息。代碼示例將會被修改。如何停止WCF服務(使用net.MSMQ綁定)從另一個Windows應用程序在IIS上託管

+2

就這麼你知道,它通常不是很好,所以要求響應者爲你編寫代碼。如果迴應者認爲他們的答案要求他們清楚,他們通常會提供代碼樣本。響應者也樂意審查你已經編寫的代碼。大多數人會希望你至少有一個在編寫自己的代碼。 –

回答

1

我能夠通過應用解決方法來解決此問題。我在另一臺機器上創建了另一個隊列。在config中將WCF客戶端端點地址的地址更改爲此隊列。我創建了另一個外部應用程序,將消息從備用隊列移至實際隊列。因此,停止IIS託管WCF服務與MSMQ綁定的行爲已實現

+1

現在我有另一個問題「如何停止WCF服務(與netTCP綁定)從另一個Windows應用程序的IIS託管」 – user1471309

1

IIS不是託管MSMQ客戶端的適當容器。這是因爲當低流量時應用程序池卸載時,隊列客戶端也會卸載。這種行爲是自動的,你無法控制它。

在Windows服務中託管你的客戶端會好得多。但是,您所需的那種「按需消費」功能並不容易實現,當然也不受標準綁定支持。

我可以建議的最好的方法就是在收到消息後立即使用消息,並將消息保存到某個位置,直到用戶單擊該按鈕,然後根據消息中的數據已經可用的情況執行任何操作。

+1

可以通過編程方式停止IIS託管的WCF服務嗎? – user1471309

+1

只能通過使用某種腳本停止/啓動應用程序池。但是,不確定這是否會奏效,即使這樣做,我認爲您目前的做法會在長期內給您帶來更多問題。 –

+1

感謝您的評論。我必須開發一個演示來窺探現有的WCF服務和隊列。演示服務將像往常一樣運行 – user1471309

0

停止「Net.Msmq偵聽器適配器」Windows服務和「Windows進程激活服務」將停止消息被拉出隊列。備份服務的啓動將導致消息再次從隊列中拉出。我手動執行此操作,而不是通過另一個應用程序,但我認爲你可以通過另一個應用程序來完成。我還沒有完全測試這一點,但這樣的事情可能會工作:

Dictionary<string,List<string>> runningDependentServices = new Dictionary<string,List<string>>(); 
    private void StartMsmqBinding() 
    { 
     StartService("WAS"); 
     StartService("NetMsmqActivator"); 
    } 
    private void StopMsmqBinding() 
    { 
     StopService("NetMsmqActivator"); 
     StopService("WAS"); 
    } 
    private void StartService(string serviceName) 
    { 
     List<string> previouslyRunningServices = null; 
     var sc = new ServiceController(); 
     sc.ServiceName = serviceName; 
     if (runningDependentServices.ContainsKey(serviceName)) 
     { 
      previouslyRunningServices = runningDependentServices[serviceName]; 
     } 
     try 
     { 
      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running); 
      if(previouslyRunningServices != null) 
      { 
       previouslyRunningServices.ForEach(a => 
       { 
        var serviceController = new System.ServiceProcess.ServiceController() { ServiceName = a }; 
        serviceController.Start(); 
        serviceController.WaitForStatus(ServiceControllerStatus.Running); 
       }); 
      } 

     } 
     catch (InvalidOperationException) 
     { 
     } 
    } 
    private void StopService(string serviceName) 
    { 
     var sc = new System.ServiceProcess.ServiceController() { ServiceName = serviceName }; 
     runningDependentServices[serviceName] = sc.DependentServices.Where(a => a.Status == System.ServiceProcess.ServiceControllerStatus.Running).Select(a => a.ServiceName).ToList(); 
     if (sc.CanStop) 
     { 
      try 
      { 
       sc.Stop(); 
       sc.WaitForStatus(ServiceControllerStatus.Stopped); 
      } 
      catch (InvalidOperationException) 
      { 
      } 
     } 
    } 

我想類似的方法將用於net.tcp綁定工作。在這種情況下,您可能不得不停止「Net.Tcp偵聽程序適配器」Windows服務(ServiceName:「NetTcpActivator」)和「Windows進程激活服務」。

相關問題