2011-12-23 36 views
1

我有一個將消息寫入隊列(MSMQ)的舊式客戶端。我想使用WCF服務從隊列中選擇XML消息。我跟隨了一些MSFT文檔,並在其他示例中使用過,但我似乎無法使其起作用。服務主機正在啓動,但它不會觸發我的進程並從隊列中選擇消息。最有可能的用戶錯誤,只是不知道是什麼。WCF MsmqIntegrationBinding - 不選擇隊列中的消息

我可以在隊列中看到消息嗎?

代碼示例:

[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

+0

您的服務名稱不顯示完全限定的名稱。 – Rajesh 2011-12-23 10:24:50

回答

3

在你的配置以下元素需要,如下圖所示:

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

你上面犯規服務名稱包括一個命名空間,它應始終的一個完全合格的名稱服務

+0

現貨感謝!看着這個。 – scarpacci 2011-12-23 14:55:50