首页 > 解决方案 > HTTP Sender 和 REST 约定

问题描述

我正在编写一个 C# Web API 服务器应用程序,并将通过 Mirth HTTP Sender 目标向它发送 JSON。这篇文章是关于如何处理错误情况的。具体来说,我要处理三种情况:

  1. 有时我们为了系统升级或维护,让 C# 应用服务器短时间离线,Mirth 根本无法连接。我希望 Mirth 将所有消息按顺序排列,当服务器可用时,按接收顺序处理它们。
  2. 服务器接收到请求,但由于请求的内容有问题(例如缺少必填字段)而拒绝了它。根据 REST 约定,服务器将返回 400 级 HTTP 响应。此消息每次提交都会被拒绝,因此不应重新发送;只需记录失败并继续下一条消息。
  3. 服务器收到请求,但服务器出现问题,服务器返回 HTTP 500 Server Error 响应。这将是适当的响应,例如,当服务器环境中出现问题时。一个真实的例子是 Web API 服务器正在运行,但有人重新启动了数据库服务器。REST 约定建议我们继续重新发送消息,直到暂时性问题得到解决。

对于#1,最初我让它在失败/总是排队,但似乎响应转换器从未针对排队的消息运行(至少,调试语句从未显示在日志中)。我已关闭排队,并将其设置为每十秒重试一个小时,这似乎给出了所需的行为。我是在正确的轨道上,还是错过了什么?

对于 #2 和 #3,返回任何 HTTP 400 或 500 错误会调用 1 小时重试。我想要的是对 500 个错误应用 1 小时重试,而不是 400 个错误。我已经responseStatus = SENT在响应转换器中尝试过,但是响应转换器只运行一次,在一小时过后,而不是每次重试。

这似乎是一个常见问题,但我没有找到解决方案。你们其他人是如何处理这个问题的?

标签: mirth

解决方案


你很近!

因此,默认情况下,响应转换器仅在有要转换的响应负载时才会运行。对于连接问题,或者可能对于不包含有效负载的 4xx/5xx 响应,响应转换器将不会执行。

但是,如果您将响应数据类型(从 Summary -> Set Data Types 对话框,或从 Destinations -> Edit Response,Message Templates 选项卡)设置为 Raw,则响应转换器将一直执行。原因是原始数据类型甚至认为空有效负载是“可转换的”。

因此,重新打开排队,并将您的响应数据类型设置为 Raw。然后在响应转换器中,如果您查看 Reference 选项卡,则会有一个 HTTP Sender 类别:

HTTP 发送器函数

您需要“响应状态行”,即包含响应代码的响应的“HTTP/1.1 200 OK”行。这是一个响应转换器脚本,它强制 4xx 响应错误:

if (responseStatus == QUEUED) {
    var statusLine = $('responseStatusLine');

    if (statusLine) {
        var parts = statusLine.split(' ');
        if (parts.length >= 2) {
            var responseCode = parseInt(parts[1], 10);

            // Force 4xx responses to error
            if (responseCode >= 400 && responseCode < 500) {
                responseStatus = ERROR;
                responseStatusMessage = statusLine;
            }
        }
    }
}

推荐阅读