2

我有一个使用 IIS 上托管的 MSMQ 的 WCF 服务。我想创建一个可以阻止 WCF 服务选择 MSMQ 消息的 Windows 应用程序。一旦我看到队列中的 MSMQ 消息,我需要单击一个按钮并启动 WCF 服务来选择 MSMQ 中的消息。代码示例将被理解。

4

3 回答 3

1

IIS 不是承载 MSMQ 客户端的合适容器。这是因为当应用程序池在低流量期间卸载时,队列客户端也会卸载。这种行为是自动的,您无法控制它。

将客户端托管在 Windows 服务中会好得多。但是,您需要的那种“按需消费”功能并不容易实现,而且标准绑定当然也不支持。

我可以建议的最好的方法是在收到消息后立即使用它并将其保留在某处,直到用户单击按钮,您可以在该按钮上执行任何您想要的操作,因为消息中的数据已经可用。

于 2012-06-21T08:31:39.433 回答
1

我能够通过应用解决方法来解决这个问题。我在另一台机器上创建了另一个队列。将 WCF 客户端端点地址的地址更改为配置中的此队列。我创建了另一个外部应用程序,将消息从备用队列移动到实际队列。从而实现了通过 MSMQ 绑定停止 IIS 托管的 WCF 服务的行为

于 2012-06-27T11:22:55.960 回答
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 服务(服务名称:“NetTcpActivator”)和“Windows 进程激活服务”。

于 2014-12-08T19:48:36.700 回答