2

我有一个使用 MSMQ 通信的 WCF 服务,当我在本地网络上运行服务时,我在客户端配置文件中配置服务端点以指向主机,例如,如果服务主机上指定的端点是:

<endpoint address="net.msmq://localhost/private/MsmqService/MyMsmqService"
         binding="netMsmqBinding" bindingConfiguration="test" contract="MsmqService.IMyMsmqService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

我将客户端配置为向此端点发送消息:

<endpoint address="net.msmq://192.168.1.5/private/MsmqService/MyMsmqService"
         binding="netMsmqBinding" bindingConfiguration="test" contract="MsmqService.IMyMsmqService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

显然 192.168.1.5 是主机的 IP,这就像一个魅力。我在 IIS 7 中托管我的服务,我在 IIS 上激活 MSMQ 侦听器,提供适当的访问权限等(Tom Hollanders 文章中的几乎所有内容),我什至可以在浏览器中通过 http 访问我的服务,但是当我创建我的客户端时托管在 IIS 中并在客户端配置端点的服务App.config,自然我将我的客户端配置为:

<endpoint address="net.msmq://ServiceHostPublicIP/private/MsmqService/MyMsmqService"
         binding="netMsmqBinding" bindingConfiguration="test" contract="MsmqService.IMyMsmqService">
        <identity>
            <dns value="localhost" />
        </identity>
</endpoint>

这就是事情出错的地方。我发送的消息一直在客户端计算机上的传出队列中排队:DIRECT=OS:[ServiceHostPublicIP]\private$\MsmqService\MyMsmqService 并且队列的状态始终为:“等待连接”。我已尝试将队列传输协议设置为SRMP,我的队列名称与 IIS 要求的服务名称相同,并且我已授予队列适当的权限。有没有人最近遇到过这个问题?有任何想法吗?如果有人可以通过 HTTP 共享 MSMQ 的工作示例(如果他们有的话),那就太好了。

任何帮助将不胜感激。提前致谢。

4

1 回答 1

4

我设法解决了这个问题,我的消息卡在客户端机器上的传出队列中,“DIRECT=TCP:HOSTSERVERIP\private$\MsmqService/MyMsmqService.svc”队列的状态是“等待连接”,下一个hop 是目标服务器的公共 IP,因此客户端无法连接到目标队列,即使它可以 ping 目标服务器的公共 IP,结果 MSMQ 用于侦听传入流量的端口 1801 在服务主机所在网络的路由器,打开端口 1801后,一切正常。这是一个非常基本的问题,我想很多人都没有在他们的文章/教程中提到它。希望这对以后的人有所帮助。

于 2012-02-29T08:05:41.990 回答