1

我有一个向 WCF Web 服务发送 HL7 v2 消息的目的地。我已经成功地将消息正确地发送到了 web 服务(在修复了各种编码问题之后),并且我可以确认消息正确地到达了 WCF 端点。但是,在论坛和文档中四处寻找之后,我无法正确解析我们收到的 ACK 以指示何时发生错误。

从 Web 服务返回的响应如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header/>
    <s:Body>
        <ProcessMessageResponse xmlns="http://www.bluewire-technologies.com/webservices">  
            <ProcessMessageResult>
               MSH|^~\&amp;|Epro|RGR|||||ACK||D||||||GBR|ASCII|
               MSA|AE||Empty message|
               ERR|^^^100|
            </ProcessMessageResult>
        </ProcessMessageResponse>
    </s:Body>
</s:Envelope>

响应在 ProcessMessageResult 元素中包含一个 ACK​​。如何从响应中提取此 ACK 并将其作为目标的输出传递?Mirth 会自动解析 ACK 并确定有错误吗?

我曾认为我需要在目的地上使用某种转换器(称为“SOAP”)并使用以下内容:

var xml = responseMap.get('SOAP').getMessage(); 

然后提取 ProcessMessageResponse 元素,但 responseMap.get('SOAP') 返回 null 所以这似乎是错误的方法。

4

1 回答 1

2

由于Mirth 论坛上的回答,我现在已经解决了部分问题。

总而言之,我使用以下后处理器来提取 ack 并更新状态:

var s = new Namespace('http://schemas.xmlsoap.org/soap/envelope/');
var bw = new Namespace('http://www.bluewire-technologies.com/webservices');

var response = new XML($r('SOAP').getMessage());
var ack = new XML(SerializerFactory.getHL7Serializer().toXML(response.s::Body.bw::ProcessMessageResponse.bw::ProcessMessageResult.toString()));

var ackCode = ack.MSA['MSA.1']['MSA.1.1'].toString();
if(ackCode == 'AE')
{
    var errorMessage = ack.MSA['MSA.3']['MSA.3.1'].toString();
    var messageController = com.mirth.connect.server.controllers.DefaultMessageObjectController.create();
    var channelStatisticsController = com.mirth.connect.server.controllers.DefaultChannelStatisticsController.create();

    messageObject.getContext().put("replace", "true"); // yuk - this is to make setError below work.
    messageController.setError(messageObject, null, errorMessage, null, null);
    channelStatisticsController.decrementSentCount(new java.lang.String(channelId));
}

不漂亮,但它的工作...

于 2012-07-05T16:03:09.267 回答