use*_*890 5 wcf jax-ws mule mirth
我也在Mirth论坛上问了这个问题.
我们目前正在尝试使用开源医疗保健集成引擎Mirth连接到WCF服务.Mirth是基于Java的,在内部使用Mule,它使用JAX-WS.WCF服务器返回HTTP状态代码"400:错误请求".我们无法轻松访问WCF服务器.
与客户的通信在C#中运行良好.在Visual Studio中,添加服务引用,然后在main()中:
PatientRegistryQueryFulfiller.GetDemographicsClient svc = new PatientRegistryQueryFulfiller.GetDemographicsClient();
doc.Load(@"C:\MirthTesting\PRPA_EX201307NO_10_PatientReg_GetDemographics.xml");
PatientRegistryQueryFulfiller.PRPA_IN201307NO patientRegistryRequest = (PatientRegistryQueryFulfiller.PRPA_IN201307NO)ObjectSerializer.DeserializeObject(doc, typeof(PatientRegistryQueryFulfiller.PRPA_IN201307NO));
PatientRegistryQueryFulfiller.PRPA_IN201307NOResponse patientRegistryResponse = svc.GetDemographics(patientRegistryRequest);
doc = ObjectSerializer.SerializeObject(patientRegistryResponse.Item);
Run Code Online (Sandbox Code Playgroud)
自动生成的WCF客户端(来自WSDL)具有带端点的app.config,并且此绑定:
<bindings>
<basicHttpBinding>
<binding name="PatientRegistryQueryFulfiller_Binding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="655360"
maxBytesPerRead="4096" maxNameTableCharCount="655360" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
在WCF解决方案中唯一不同的做法是在相关绑定的readerQuotas标记中扩展maxNameTableCharCount和maxArrayLength,其余部分保留默认值.但是,我还没有找到在Mirth中设置这些的方法,如果这确实是错误的原因.
我们正在运行Mirth v 2.2.1(最近结账),并且Mirth Channel设置为读取和发送HL7v3文档.只有在尝试与WCF服务进行通信时才会出现问题.目标是Web Service Sender,从WSDL读取服务和端口.没有任何验证,信封是从唯一可用的操作生成的.我们没有使用MTOM.
我们相当确定这与JAX-WS和WCF互操作性有关.任何一般提示?
我们已经尝试在JAX-WS连接上设置属性.在欢乐的深处,我们尝试设置http块大小:dispatch.getRequestContext().put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE,8192)(WebServiceMessageDispatcher.Java line 140)
堆栈跟踪如下:
ERROR-410: Web Service Connector error
ERROR MESSAGE: Error connecting to web service.
com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 400: Bad Request
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.checkStatusCode(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Unknown Source)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Unknown Source)
at com.sun.xml.internal.ws.client.Stub.process(Unknown Source)
at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(Unknown Source)
at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(Unknown Source)
at com.mirth.connect.connectors.ws.WebServiceMessageDispatcher.processMessage(WebServiceMessageDispatcher.java:176)
at com.mirth.connect.connectors.ws.WebServiceMessageDispatcher.doDispatch(WebServiceMessageDispatcher.java:106)
at com.mirth.connect.connectors.ws.WebServiceMessageDispatcher.doSend(WebServiceMessageDispatcher.java:204)
at org.mule.providers.AbstractMessageDispatcher.send(AbstractMessageDispatcher.java:164)
at org.mule.impl.MuleSession.sendEvent(MuleSession.java:191)
at org.mule.impl.MuleSession.sendEvent(MuleSession.java:130)
at org.mule.routing.outbound.AbstractOutboundRouter.send(AbstractOutboundRouter.java:85)
at org.mule.routing.outbound.FilteringMulticastingRouter.route(FilteringMulticastingRouter.java:54)
at org.mule.routing.outbound.OutboundMessageRouter$1.doInTransaction(OutboundMessageRouter.java:78)
at org.mule.transaction.TransactionTemplate.execute(TransactionTemplate.java:48)
at org.mule.routing.outbound.OutboundMessageRouter.route(OutboundMessageRouter.java:82)
at org.mule.impl.model.DefaultMuleProxy.onCall(DefaultMuleProxy.java:247)
at org.mule.impl.model.seda.SedaComponent.doSend(SedaComponent.java:209)
at org.mule.impl.model.AbstractComponent.sendEvent(AbstractComponent.java:277)
at org.mule.impl.MuleSession.sendEvent(MuleSession.java:201)
at org.mule.routing.inbound.InboundMessageRouter.send(InboundMessageRouter.java:176)
at org.mule.routing.inbound.InboundMessageRouter.route(InboundMessageRouter.java:143)
at org.mule.providers.AbstractMessageReceiver$DefaultInternalMessageListener.onMessage(AbstractMessageReceiver.java:487)
at org.mule.providers.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:266)
at org.mule.providers.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:225)
at com.mirth.connect.connectors.vm.VMMessageReceiver.getMessages(VMMessageReceiver.java:223)
at org.mule.providers.TransactedPollingMessageReceiver.poll(TransactedPollingMessageReceiver.java:108)
at org.mule.providers.PollingMessageReceiver.run(PollingMessageReceiver.java:97)
at org.mule.impl.work.WorkerContext.run(WorkerContext.java:290)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
小智 3
我们找到了解决方案。Mirth 论坛上解决方案的详细描述。
问题是,当我们尝试向 Web 服务发送我们认为有意义的请求时,Web 服务给了我们一个“400:错误请求”。“400 bad request”是一个非常通用且信息量不大的错误。
该解决方案创建了一个可调试的基于文件的测试工具,您可以使用它来了解 Mirth 的作用。它不是生产质量的解决方案。YMMV。
肥皂:地址位置=“http://your-server/HL7Connector/GetDemographicsService30/”/
打开 HTTP 转储(在 Eclipse 中)。在“运行配置”下输入虚拟机参数。这可以让您准确地看到 Mirth(或您的 Java 客户端)发送到 Web 服务的内容: -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true
将预处理脚本添加到您的发送者通道以查看 Mirth 实际执行的操作:
FileUtil.write('C:/MirthTesting/read/sender_preprocessmessage_in.txt', false, message);return message;
Run Code Online (Sandbox Code Playgroud)将后处理脚本添加到您的发送者通道以查看 Mirth 的作用:
FileUtil.write('C:/MirthTesting/read/dipssender_postprocessmessage.txt', false, message);
return;
Run Code Online (Sandbox Code Playgroud)为了真正实现这项工作,我们必须对 Mirth 源代码进行一项更改。在我们使用的 JDK1.7 中,Mirth 实际上并没有发送 SOAP 操作。在 Server/.../WebServiceMessageDispatcher.Java 第 137 行中,我们必须添加:
dispatch.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
Run Code Online (Sandbox Code Playgroud)
(摘自这篇博文)
归档时间: |
|
查看次数: |
6916 次 |
最近记录: |