我有一个使用MSMQ托管在IIS上的WCF服务。我想创建一个Windows应用程序,它可以阻止WCF服务选择MSMQ消息。一旦我看到队列中的MSMQ消息,我需要单击一个按钮并启动WCF服务以在MSMQ中选择消息。代码示例将会被修改。如何停止WCF服务(使用net.MSMQ绑定)从另一个Windows应用程序在IIS上托管
回答
我能够通过应用解决方法来解决此问题。我在另一台机器上创建了另一个队列。在config中将WCF客户端端点地址的地址更改为此队列。我创建了另一个外部应用程序,将消息从备用队列移至实际队列。因此,停止IIS托管WCF服务与MSMQ绑定的行为已实现
现在我有另一个问题“如何停止WCF服务(与netTCP绑定)从另一个Windows应用程序的IIS托管” – user1471309
IIS不是托管MSMQ客户端的适当容器。这是因为当低流量时应用程序池卸载时,队列客户端也会卸载。这种行为是自动的,你无法控制它。
在Windows服务中托管你的客户端会好得多。但是,您所需的那种“按需消费”功能并不容易实现,当然也不受标准绑定支持。
我可以建议的最好的方法就是在收到消息后立即使用消息,并将消息保存到某个位置,直到用户单击该按钮,然后根据消息中的数据已经可用的情况执行任何操作。
可以通过编程方式停止IIS托管的WCF服务吗? – user1471309
只能通过使用某种脚本停止/启动应用程序池。但是,不确定这是否会奏效,即使这样做,我认为您目前的做法会在长期内给您带来更多问题。 –
感谢您的评论。我必须开发一个演示来窥探现有的WCF服务和队列。演示服务将像往常一样运行 – user1471309
停止“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进程激活服务”。
- 1. IIS WCF服务托管与Windows服务
- 2. 在IIS中使用netTCP绑定托管的WCF服务
- 3. WCF服务托管在Windows服务+ Silverlight + Silverlight应用程序
- 4. 托管的Windows服务中托管的WCF服务使用WCF服务应用程序连接
- 5. 如何在另一个WCF服务中托管WCF服务?
- 6. 如何在应用程序上托管wcf服务器?
- 7. 64位Windows服务器上的WCF自托管应用程序
- 8. 托管WCF服务,从另一个PC
- 9. 在IIS上托管WCF服务
- 10. 在IIS上托管WCF服务
- 11. 在Windows服务中托管的WCF服务上使用证书
- 12. 如何在IIS托管的wcf上使用用户定义的绑定?
- 13. Windows窗体应用程序在Windows托管服务上运行
- 14. 如何在IIS7.5上托管自定义wcf应用程序(服务器)?
- 15. 如何从线程停止Windows服务应用程序?
- 16. .net Windows服务托管的WCF使用
- 17. 使用net.msmq绑定激活带MSMQ的IIS托管工作流程
- 18. 在我已经有一个Web站点的IIS 7上托管一个WCF服务应用程序
- 19. 如何在1个Windows服务中托管2个WCF服务?
- 20. 从IIS中托管的ASP.NET Web应用程序接收WCF回调服务
- 21. WCF Rest服务引用另一个应用程序托管的WCF服务。找不到默认端点?
- 22. 如何从IIS托管的WCF服务启动进程?
- 23. 如何从IIS7中承载的另一个WCF服务评估Windows服务托管的WCF服务?
- 24. 为什么在IIS中托管的WCF Web服务会随机停止响应?
- 25. 使用Windows 2008服务器上的Windows应用程序托管的WCF服务的PHP SoapClient
- 26. 如何在本地IIS服务器上托管Angular应用程序?
- 27. Windows窗体应用程序调用WCF服务和WCF服务调用另一个WCF服务
- 28. 托管在IIS(Windows 10)上时无法在Web应用程序中托管LocalDB
- 29. 使用Spring.Net,如何在控制台应用程序中托管WCF服务?
- 30. WCF和托管Windows服务
就这么你知道,它通常不是很好,所以要求响应者为你编写代码。如果回应者认为他们的答案要求他们清楚,他们通常会提供代码样本。响应者也乐意审查你已经编写的代码。大多数人会希望你至少有一个在编写自己的代码。 –