.net NServiceBus Bus.Send().寄存器(回调)在IIS/Windows Server 2008上不工作

.net NServiceBus Bus.Send().寄存器(回调)在IIS/Windows Server 2008上不工作,.net,wcf,iis,msmq,nservicebus,.net,Wcf,Iis,Msmq,Nservicebus,我已经为这个问题挣扎了几天,但我似乎无法解决它 我在IIS和Windows Server 2008 R2上有一个简单的WCF web服务。Web服务的实现如下所示: var completionResult = new CompletionResult(); var updateTextMessage = new UpdateText { TextTemplateId = textTemplateId, Text = text }; var as

我已经为这个问题挣扎了几天,但我似乎无法解决它

我在IIS和Windows Server 2008 R2上有一个简单的WCF web服务。Web服务的实现如下所示:

        var completionResult = new CompletionResult();
        var updateTextMessage = new UpdateText { TextTemplateId = textTemplateId, Text = text };

        var asyncResult = Global.Bus.Send(updateTextMessage).Register(x => completionResult = x.AsyncState as CompletionResult, null);
        asyncResult.AsyncWaitHandle.WaitOne(10000);

        if (completionResult.Messages != null && completionResult.Messages.Length > 0)
        {
            return ((UpdateTextResponse)completionResult.Messages[0]).ImageData;
        }

        return string.Empty;
我知道尝试以同步方式使用NSB被认为是糟糕的设计,但我只是在尝试,我真的很想让它工作起来。因此,问题是消息成功地发送到远程端点,并且消息被成功处理,但是当远程端点执行Bus.reply时,应答消息在以太中丢失。我使用的是最新版本的NSB,奇怪的是它在我的Windows7开发机器上运行良好。我已确保两台计算机上的active directory都已关闭。我还在接收端点上运行了Wireshark,我确实在数据包数据中看到了传入消息。似乎有些事情并没有与IIS发生冲突。我还将两个端点的日志记录阈值切换为DEBUG,并且没有发生任何异常。发送端点表示通常的“发送消息到…”以下是web组件的“我的应用程序启动”中的代码:

        Bus = NServiceBus.Configure.WithWeb()
            .Log4Net()
            .DefaultBuilder()
            .XmlSerializer()
            .MsmqTransport()
                .IsTransactional(false)
                .PurgeOnStartup(false)
            .UnicastBus()
                .ImpersonateSender(false)
            .CreateBus()
            .Start();
以下是端点的配置:

IIS Config (this side is not getting the response)

<MsmqTransportConfig InputQueue="Web.InputQueue" ErrorQueue="Web.ErrorQueue" MaxRetries="5" NumberOfWorkerThreads="1"/>
  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="Messages" Endpoint="Node.Distributor.DataInputQueue"/>
    </MessageEndpointMappings>
  </UnicastBusConfig>

---------------------------------------------------------------

Endpoint which does the reply

<MsmqTransportConfig ErrorQueue="Node.ErrorQueue" InputQueue="Node.InputQueue" MaxRetries="5" NumberOfWorkerThreads="1"/>
<UnicastBusConfig DistributorControlAddress="Node.Distributor.ControlInputQueue" DistributorDataAddress="Node.Distributor.DataInputQueue" />
IIS配置(此端未获得响应)
---------------------------------------------------------------
哪个端点进行应答

我还创建了两个独立的NServiceBusHost应用程序来测试通信,并成功运行。我还硬编码了回信地址,并将.Reply替换为.Send,但指定了实际目的地,结果仍然不起作用。因此,它似乎再次与IIS有关。任何帮助都将不胜感激

听起来像是队列权限。检查WCF端的队列,看看msmq是否能够传递消息

我解决了这个问题。结果表明,回复丢失的原因是因为我引用了分销商:

<UnicastBusConfig DistributorControlAddress="Node.Distributor.ControlInputQueue@10.1.4.58" DistributorDataAddress="Node.Distributor.DataInputQueue@10.1.4.58" />

但事实证明,NServiceBus分销商不喜欢IPs。因此,我将其更改为以下内容:

<UnicastBusConfig DistributorControlAddress="Node.Distributor.ControlInputQueue@HOSTNAME" DistributorDataAddress="Node.Distributor.DataInputQueue@HOSTNAME" />


这就解决了问题。由于NSB/MSMQ使用主机名,我还必须在Windows中更新主机文件。我不确定这是否是NServiceBus中的一个bug,或者这是否是一个已知问题,但如果还没有,则应该将其记录下来。

感谢您的回复。我认为权限很好。我在启动应用程序池之前删除了队列,一旦WCF服务被点击,NSB就会创建这些队列。我甚至给了“所有人”用户WCF侧队列完全控制权,但这没有帮助。你能发布nservicebus配置文件吗?还值得检查来自远程端点的bus.Reply()上的地址。好的,我发布了配置。谢谢