【问题标题】:HTTP Sender and REST conventionsHTTP Sender 和 REST 约定
【发布时间】:2018-05-24 17:34:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: mirth


    【解决方案1】:

    你已经接近了!

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

    但是,如果您将响应数据类型(从摘要 -> 设置数据类型对话框,或从目标 -> 编辑响应,消息模板选项卡)设置为 Raw,则响应转换器将一直执行。原因是 Raw 数据类型甚至认为空负载也是“可转换的”。

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

    您需要“响应状态行”,即包含响应代码的响应的“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;
                }
            }
        }
    }
    

    【讨论】:

    • 我试过了,效果很好,正是我想要的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多