2012-06-21 28 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进程激活服务”。

相关问题