WCF MsmqIntegrationBinding - 不从队列中选取消息

发布于 2024-12-22 19:40:59 字数 3703 浏览 0 评论 0原文

我有一个旧客户端正在将消息写入队列 (MSMQ)。我想使用 WCF 服务从队列中选取 XML 消息。我遵循了一些 MSFT 文档并浏览了其他示例,但我似乎无法让它工作。服务主机正在启动,但它没有启动我的进程并从队列中选取消息。最有可能的是用户错误,只是不确定是什么。

我可以看到队列中的消息吗?

代码示例:

   [ServiceContract]
    [ServiceKnownType(typeof(XElement))]
    public interface IMessageProcessor
    {
        [OperationContract(IsOneWay = true, Action = "*")]
        void ProcessMessage(MsmqMessage<XElement> msg);
    }
    class MessageServiceClient : IMessageProcessor
    {
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public void ProcessMessage(MsmqMessage<XElement> msg)
        {
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            {
                Console.WriteLine("Processing {0} ", msg.ToString());
                scope.Complete();
            }

        }

        static void Main(string[] args)
        {
            Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
            // Create a ServiceHost for the CalculatorService type and provide the base address.
            using (ServiceHost serviceHost = new ServiceHost(typeof(MessageServiceClient), baseAddress))
            {
                // Open the ServiceHostBase to create listeners and start listening for messages.
                serviceHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("The service is running in the following account: {0}");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                serviceHost.Close();
            }
        }
    }

应用程序配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- use appSetting to configure MSMQ queue name -->
    <add key="QueueName" value=".\private$\MyMessageQueue" />
    <add key="baseAddress" value="http://localhost:8000/test/message" />
  </appSettings>
  <system.serviceModel>
    <services>
      <service name="MessageServiceClient">
        <!-- .Net endpoint-->
        <endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyMessageQueue"
                  binding="msmqIntegrationBinding"
                  bindingConfiguration="DotNetBinding"
                  contract="WcfServiceClient.IMessageProcessor" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MessageServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata />
          <!--<serviceThrottling maxConcurrentCalls="20" maxConcurrentSessions="20" />-->
          <serviceTimeouts />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <msmqIntegrationBinding>
        <binding serializationFormat="ActiveX" name="ActiveXBinding" durable="false" exactlyOnce="false">
          <security mode="None" />
        </binding>
        <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false">
          <security mode="None" />
        </binding>
      </msmqIntegrationBinding>
    </bindings>
  </system.serviceModel>
</configuration>

不确定我做错了什么?

--S

I have a legacy client that is writing messages to a queue (MSMQ). I wanted to use a WCF service to pick the XML messages up off of the queue. I followed some of the MSFT docs and poked around at other examples, but i can't seem to get it to work. The service host is starting, but it is not firing my process and picking messages off of the queue. Most likely user error, just not sure what.

I can see messages in the queue?

Code Example:

   [ServiceContract]
    [ServiceKnownType(typeof(XElement))]
    public interface IMessageProcessor
    {
        [OperationContract(IsOneWay = true, Action = "*")]
        void ProcessMessage(MsmqMessage<XElement> msg);
    }
    class MessageServiceClient : IMessageProcessor
    {
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public void ProcessMessage(MsmqMessage<XElement> msg)
        {
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            {
                Console.WriteLine("Processing {0} ", msg.ToString());
                scope.Complete();
            }

        }

        static void Main(string[] args)
        {
            Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
            // Create a ServiceHost for the CalculatorService type and provide the base address.
            using (ServiceHost serviceHost = new ServiceHost(typeof(MessageServiceClient), baseAddress))
            {
                // Open the ServiceHostBase to create listeners and start listening for messages.
                serviceHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("The service is running in the following account: {0}");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                serviceHost.Close();
            }
        }
    }

App Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- use appSetting to configure MSMQ queue name -->
    <add key="QueueName" value=".\private$\MyMessageQueue" />
    <add key="baseAddress" value="http://localhost:8000/test/message" />
  </appSettings>
  <system.serviceModel>
    <services>
      <service name="MessageServiceClient">
        <!-- .Net endpoint-->
        <endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyMessageQueue"
                  binding="msmqIntegrationBinding"
                  bindingConfiguration="DotNetBinding"
                  contract="WcfServiceClient.IMessageProcessor" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MessageServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata />
          <!--<serviceThrottling maxConcurrentCalls="20" maxConcurrentSessions="20" />-->
          <serviceTimeouts />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <msmqIntegrationBinding>
        <binding serializationFormat="ActiveX" name="ActiveXBinding" durable="false" exactlyOnce="false">
          <security mode="None" />
        </binding>
        <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false">
          <security mode="None" />
        </binding>
      </msmqIntegrationBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Not sure what I am doing wrong?

--S

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

洒一地阳光 2024-12-29 19:40:59

在您的配置中,以下元素需要如下所示:

<services>
      <service name="WcfServiceClient.MessageServiceClient">
        <!-- .Net endpoint-->
        <endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyMessageQueue"  
                  binding="msmqIntegrationBinding"
                  bindingConfiguration="DotNetBinding"
                  contract="WcfServiceClient.IMessageProcessor" />
      </service>
    </services>

上面的服务名称不包含命名空间,它应该始终是服务的完全限定名称

In your config the following element needs to be as shown below:

<services>
      <service name="WcfServiceClient.MessageServiceClient">
        <!-- .Net endpoint-->
        <endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyMessageQueue"  
                  binding="msmqIntegrationBinding"
                  bindingConfiguration="DotNetBinding"
                  contract="WcfServiceClient.IMessageProcessor" />
      </service>
    </services>

Your service name above doesnt include a namespace, it should always be a fully qualified name of the service

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文