我几天来一直在努力解决这个问题,我似乎无法弄明白。
我在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,奇怪的是这在我的Windows 7开发机器上运行良好。我已确保两台计算机上的活动目录都已关闭。我还在接收端点上运行了Wireshark,当然我在分组数据中看到了传入的消息。似乎有些东西不是用IIS来讨价还价。我还将两个端点的日志记录阈值切换为DEBUG,并且没有任何异常情况发生。发送端点说通常“向...发送消息”这是我的Application_Startup中的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" />
我还创建了两个独立的NServiceBusHost应用程序来测试通信,并且它成功运行。我还硬编码了返回地址并用.Send替换了.Reply,但是指定了实际的目标,但它仍然无效。所以它似乎又与IIS有关。任何帮助将不胜感激!
答案 0 :(得分:1)
我解决了这个问题。事实证明,回复丢失的原因是因为我正在引用分销商:
<UnicastBusConfig DistributorControlAddress="Node.Distributor.ControlInputQueue@10.1.4.58" DistributorDataAddress="Node.Distributor.DataInputQueue@10.1.4.58" />
但事实证明,NServiceBus分销商不喜欢IP。所以我把它改成了以下内容:
<UnicastBusConfig DistributorControlAddress="Node.Distributor.ControlInputQueue@HOSTNAME" DistributorDataAddress="Node.Distributor.DataInputQueue@HOSTNAME" />
这解决了这个问题。我还必须在Windows中更新我的hosts文件,因为NSB / MSMQ使用主机名。我不确定这是否是NServiceBus中的错误,或者它是否是一个已知问题,但如果它还没有,那么它应该被记录下来。
答案 1 :(得分:0)
听起来像我的队列权限。检查WCF端的队列,看看msmq是否可以传递消息