c# - 如何发送 HL7 ACK 消息作为 TCP 响应?

标签 c# hl7 kestrel nhapi mllp

我正在通过 TCP 连接接收 HL7 消息。这些消息将始终是 ADT 类型。我正在使用 Kestrel 来监听这些消息,并使用 NHAPI 包来处理它们。我拍了David Fowler's Kestrel sample code设置 TCP 监听器。所以基于这个示例代码

internal class HL7Listener : ConnectionHandler
{
    public override async Task OnConnectedAsync(ConnectionContext connection)
    {
        try
        {
            // handle the incoming message
        }
        catch (Exception exception)
        {
            // handle exceptions
        }
        finally
        {
            ACK acknowledgement = new ACK(); // create an ACK message
            PipeParser pipeParser = new PipeParser();
            string ackMessage = pipeParser.Encode(acknowledgement); // produces => MSH|^~\&|||||||ACK|||2.3
            byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);
            
            await connection.Transport.Output.WriteAsync(ackMessageBytes); // send the ACK
        }
    }
}

我正在使用工具 7Edit 将 HL7 消息发送到我的应用程序。来自存储库(上面的链接)的 echo 示例工作正常。 echo 示例代码生成这样的日志

enter image description here

但是在使用我的代码时出现这个错误

enter image description here

所以我认为我没有正确转换ACK消息。有什么解决办法吗?

最佳答案

我怀疑你没有实现 MLLP (也称为 LLP)协议(protocol),同时发送 ACK。我知道,7Edit 希望实现 MLLP。这样,当您向 7Edit(TCP/MLLP 客户端)发送 ACK 时,它会在您的传入数据中查找起始 block 。它永远找不到它。考虑到垃圾,它只是丢弃您的整个消息并继续等待;如您所见,这会导致超时。

也许你应该在 7Edit 中寻找一些设置来禁用 MLLP;但这将是临时解决方案。更好的是,您实现 MLLP block 。

Description                 HEX     ASCII   Symbol
Message starting character  0B      11      <VT>
Message ending characters   1C,0D   28,13   <FS>,<CR>

实现 MLLP 后,您的消息(您在套接字上写入的内容)应该看起来像下面这样:

<VT>MSH|^~\\&|......|ACK|......<FS><CR>

注意 <VT> , <CR><FS>是上述消息中的占位符。

您应该修改以下代码行:

byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);

如下:

ackMessage = ((char) 11).ToString() + ackMessage + ((char) 28).ToString() + ((char) 13).ToString();
byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);

更多详情可引用this回答。

关于c# - 如何发送 HL7 ACK 消息作为 TCP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63935790/

相关文章:

c#-4.0 - 从 cerner 的 EMR/EHR 获取数据

linux - 如何在 .NET Core 中只使用 Kestrel

c# - 重新初始化 MembershipProvider ASP.NET

c# - 在 Windows Workflow 4 中,当我尝试仅使用条件数据触发器时,为什么我的状态会自行重新进入

c# - 中继器内的按钮不起作用

c# - 将 XML 转换为纯文本

javascript - Mirth - 在一个轮询间隔内发送多条 HL7 消息

ssl - 来自 KeyVault 的 Kestrel 安全 HTTPS X509 证书

c# - 如何配置 asp.net kestrel 以实现低延迟?

c# - 监听一系列 UDP 端口