5StringRyan
5StringRyan

Reputation: 3634

How to use msmq between WCF Router and WCF Service hosted in a Windows Service

In my current system I have a router service and over a dozen (about half use msmq, rest use tcp) WCF services hosted via IIS. I've been tasked with moving all services except for the router to a windows service. This has been accomplished using the same configurations that were present using the IIS web.config file. Here is a snippet of the previous configs (public queue for service: myservices/wcfservice):

  <!--Router Service web.config-->
  <client>
    <endpoint address="net.msmq://localhost/MyServices/WCFService.svc" binding="netMsmqBinding" contract="*" name="IWCFService_Msmq" />
  </client>

  <!--Services web.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.msmq://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

I'm confused as to why this works, as the service has a net.tcp binding and the router has msmq, and when I asked around, I was told it was "magic." I tried to do the same thing with my setup (router to windows service) using a similar configuration but get an error message:

<!--Router Service web.config-->
  <client>
    <endpoint address="net.msmq://localhost/MyServices/WCFService" binding="netMsmqBinding" contract="*" name="IWCFService_Msmq" />
  </client>

  <!--One "other" Services hosted in Windows Service app.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

This has worked fine with all my services that are just using tcp, but when I try this with msmq and attempt to start the windows service, I get the following error in the Event Viewer:

Service cannot be started. System.InvalidOperationException: Could not find a base address that matches scheme net.msmq for the endpoint with binding NetMsmqBinding. Registered base address schemes are [net.tcp].

I'm new to msmq, so any help with be appreciated. Thanks!

Updated:

I've updated the base address in the service app.config to match the address that is in the router web.config. I tried this previously and it didn't work. I later found out it was because I didn't make the msmq itself a "Transactional Queue" (which was needed for our setup). Once this was done, everything worked out!

<!--One "other" Services hosted in Windows Service app.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.msmq://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

Upvotes: 1

Views: 1419

Answers (2)

Ryan D
Ryan D

Reputation: 111

Judging by the error message of the InvalidOperationException, it looks like "net.tcp" is the only enabled protocol in the Advanced Settings of your application hosted in IIS.

Is "net.msmq" an enabled protocol?

  1. Open IIS Manager
  2. Select your application
  3. Click Advanced Settings in the Actions list
  4. Add "net.msmq" to Behavior - Enabled Protocols

Upvotes: 2

Mark W
Mark W

Reputation: 3909

Why not give all of your MSMQ services their own config and all the tcp services their own? The issue is obviously it looks for a base address when you choose the binding to be msmq, and it can't find an msmq binding because all you've provided is a tcp base address binding. You can also of course add another base address that uses net.msmq inside the baseaddresses node.

Upvotes: 1

Related Questions