NServiceBus Bus.Send().Register(callback) 不适用于 IIS/Windows Server 2008

2023-12-30

我已经为这个问题苦苦挣扎了几天,但我似乎无法弄清楚。

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

        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 不兼容。我还将两个端点的日志记录阈值都切换为“调试”,没有发生任何异常情况。发送端点通常会说“将消息发送到...”,这是我的 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 应用程序来测试通信,并且它工作成功。我还对返回地址进行了硬编码,并将 .Reply 替换为 .Send,但指定了实际目的地,但它仍然不起作用。看来又和IIS有关了。任何帮助将不胜感激!


我解决了这个问题。事实证明,回复丢失的原因是我这样引用经销商:

<UnicastBusConfig DistributorControlAddress="[email protected] /cdn-cgi/l/email-protection" DistributorDataAddress="[email protected] /cdn-cgi/l/email-protection" />

但事实证明,NServiceBus 发行商不喜欢 IP。所以我将其更改为以下内容:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NServiceBus Bus.Send().Register(callback) 不适用于 IIS/Windows Server 2008 的相关文章

随机推荐

  • 如何检查单个字符是否等于给定的一组字符中的至少一个?

    对不起这个标题 请随意将其编辑为更清晰的内容 我有一个字符串 我必须检查该字符串的第一个字符是否等于其他给定字符之间的至少一个 例如 B Z 和 K 在我的例子中 我有大约 10 个字符要检查 但它们不是可以分类为一个范围 我正在按如下方式
  • 无法找出C程序中的逻辑错误

    一种每行打印一个单词的输入的程序 int main int c while c getchar EOF if c c n c t putchar n else putchar c return 0 上面的程序正确打印结果 每行一个字 相应地
  • OmniContacts gem 总是无法导入我的 yahoo 联系人

    我正在使用 OmniContacts gem 将联系人从 yahoo 和 gmail 导入到我的应用程序 现在雅虎进口商停止工作 我的控制器上有以下操作 def contacts callback contacts request env
  • AngularJS 指令中没有值的属性

    我已经编写了一个具有隔离范围的指令 app directive myDirective function return restrict E scope attr1 attr2 noValueAttr what to put here li
  • Docker for Windows Kubernetes pod 在创建新部署后获取 ImagePullBackOff

    我已经成功构建了 Docker 镜像并在 Docker 群中运行它们 当我尝试构建映像并使用 Docker Desktop 的 Kubernetes 集群运行它时 docker build t myimage f myDockerFile
  • 如何比较两个字符串汇编

    谁能告诉我如何用汇编语言比较两个字符串 我写了以下内容 但它似乎不起作用 assume cs code ds data data segment sirlung db abcdjjj lungimelung equ sirlung sirs
  • 从 Mac 终端运行/打开 VSCode

    我想通过运行此命令从 Mac OSX 终端运行 打开 Visual Studio Codecode 我在这里找到了说明 https code visualstudio com Docs setup https code visualstud
  • AppBarLayout 和 Toolbar 的新 Android 设计库错误

    我正在使用基于此示例的新 Android 设计库克里斯班斯 奶酪广场 https github com chrisbanes cheesesquare在 github 和here http android developers blogsp
  • 未能在 SOAP 上加载外部实体错误

    我称为位于 https 协议上的 Web 服务 我在调用它时收到 无法加载外部实体 错误 正如我在 google 上搜索的那样 这是因为在 PHP5 中 SOAP 类不会解析位于安全 HTTPS 连接上的 WSDL 文件 解决办法是什么 我
  • iOS:检测我的SDK是否安装在设备上的其他应用程序上

    我正在为移动设备开发基于位置的问答 SDK 当询问有关特定位置的问题时 服务器端会定位最相关的用户并将问题发送给该用户 如果用户未能回答 问题将发送给第二好的用户 依此类推 问题是我的 SDK 可能安装在设备上的多个应用程序上 这意味着用户
  • 如何为 Rust 终端应用程序启用可编辑的用户输入?

    我正在用 Rust 编写一个带有经典的基于终端的 REPL 环境项目的最小 Lisp 如何从箭头键读取用户输入 允许他们至少在按下之前在当前输入行上来回移动enter 理想情况下 我将能够扩展功能 包括 返回 以检索旧输入 就像在任何终端或
  • 为什么我们需要其他 JVM 语言

    I see here http www is research de info vmlanguages index html除了 Java 之外 还有很多语言可以在 JVM 上运行 我对在 JVM 中运行的其他语言的整个概念有点困惑 所以
  • WPF Dispatcher.调用“挂起”

    我有一个有点复杂的 WPF 应用程序 当尝试使用调度程序在 UI 线程上调用调用时 该应用程序似乎 挂起 或陷入 Wait 调用中 一般流程是 处理按钮上的点击事件 创建一个新线程 STA 创建演示者和 UI 的新实例 然后调用该方法断开
  • 使用 JFileChooser 设置默认保存扩展名

    我正在尝试使用保存文件JFileChooser 但是 我似乎遇到了一些麻烦 这是我的代码 if e getSource saveMenu JFileChooser chooser new JFileChooser chooser setFi
  • 如何创建比屏幕更大的视图?

    是否可以创建比屏幕更大的视图 我需要一个比设备屏幕宽度更大的视图 我在旋转动画中使用此视图 在旋转过程中 在动画视图之前不在屏幕上的部分将变得可见 有没有办法用android框架实现这种效果 Update 我尝试将父布局设置为比屏幕大得多
  • OpenCV VideoCapture 无法打开许多视频文件

    我在使用 OpenCV 类 VideoCapture 循环打开许多视频文件 例如 200 个 时遇到问题 您可以在下面找到我的代码 更具体地说 我的程序成功打开一定数量的视频 通常是 171 173 但无法打开其他视频 我什至尝试始终打开相
  • Python 3.x - 使用文本字符串作为变量名

    我试图通过使用来避免在代码中增加函数 def Return Label self number 带参数 任何想法如何使用字符串来定义可用于的变量名称 set价值StringVar 示例代码如下 import tkinter as tk fr
  • 在自定义对象上添加事件监听器

    我创建了一个具有多种方法的对象 其中一些方法是异步的 因此我想使用事件以便能够在方法完成时执行操作 为此 我尝试将 addEventListener 添加到该对象 jsfiddle http jsfiddle net 9d7nN var i
  • 如何在 onSaveInstanceState() 中存储值并检索?

    我试图将数组列表的值存储在onSavedInstanceState 并在 onCreate 方法中获取数组列表中的值 但它会引发类似无法暂停活动的错误 这是我的代码 public void onSaveInstanceState Bundl
  • NServiceBus Bus.Send().Register(callback) 不适用于 IIS/Windows Server 2008

    我已经为这个问题苦苦挣扎了几天 但我似乎无法弄清楚 我有一个托管在 IIS 和 Windows Server 2008 R2 上的简单 WCF Web 服务 Web Service的实现如下 var completionResult new