如何在 mule 3.7.0 CE 上代理 Web 服务
How to proxy a web service on mule 3.7.0 CE
我正在使用 mule 3.4.0 CE 来代理远程 Web 服务,但是对于新的 3.7.0 CE,我找不到任何这种工作流程的示例,所以我可以使用 http 共享连接器,有什么线索吗?
不适用于基于 C# 的使用者的示例:
<flow name="Test">
<http:listener config-ref="HTTP_Listener_Configuration" path="/services/teste/teste" doc:name="HTTP"/>
<logger message="AutenticacaoServicoFlowTesteHttp - #[message]" level="INFO" doc:name="Logger"/>
<response>
<logger message="ATestHttp - response - #[message]" level="INFO" doc:name="Logger"/>
</response>
<set-variable variableName="queryStringIncompleto" value="#[message.inboundProperties.'host']/logTicket?ipFrom=#[message.inboundProperties.'http.remote.address']&requestSize=#[message.inboundProperties.'http.request.uri'.length()]&url=#[message.inboundProperties.'host']#[message.inboundProperties.'http.request.uri'.replaceAll("&", "%26")]&userName=#[message.inboundProperties.'authorization']&modifiedRequestSize=#[message.inboundProperties.'http.request.uri'.length()]" doc:name="QueryString LogTicket"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties.'http.request.uri' == '/services/Autentic?wsdl']">
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'http.method']" doc:name="QueryString LogBilhetagem"/>
<cxf:proxy-service namespace="logTeste.gov" service="AutenticacaoServico" payload="envelope" wsdlLocation="${targetServerLog}/servicos/v2/Autentic.svc?singleWsdl" soapVersion="1.2" doc:name="CXF"/>
</when>
<otherwise>
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'SOAPAction'.replaceAll("\"", "")]" doc:name="QueryString LogTicket"/>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="SOAPAction" value="#[message.inboundProperties.'SOAPAction']"/>
</message-properties-transformer>
<outbound-endpoint exchange-pattern="request-response" address="${targetServerLog}/servicos/v2/Autentc.svc" encoding="UTF-8" mimeType="text/xml" doc:name="Generic"/>
</otherwise>
</choice>
<set-variable variableName="payloadLog" value="#[message.payloadAs(java.lang.String)]" doc:name="Guarda Payload Log"/>
<outbound-endpoint exchange-pattern="request-response" address="https://teste:teste@#[flowVars.queryString]" doc:name="Log Bilhetagem"/>
<set-payload value="#[flowVars.payloadLog]" doc:name="Set Payload"/>
<response>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="Content-Type" value="text/xml"/>
</message-properties-transformer>
</response>
</flow>
在大多数使用此 WS 的 C# 应用程序中,第一个连接正常,第二个连接超时...
您尝试代理服务的方式不是理想的方式,在 3.4 中也不是理想的方式,请参阅以下文档页面:
https://developer.mulesoft.com/docs/display/current/Proxying+Web+Services+with+CXF
https://developer.mulesoft.com/docs/display/current/Web+Service+Proxy+Pattern
这是代理网络服务的两种标准方式。
好的,找到问题并解决了,不是实施,我所做的是将 WS 重定向到正确的位置,但我还将消息记录到另一个 WS,这将挂起流程并且无法执行对很多方法的级联调用。
所以我只是拿出第二个出站来记录消息,我将使用另一种方法来记录消息。
代码:
<flow name="Test">
<http:listener config-ref="HTTP_Listener_Configuration" path="/services/teste/teste" doc:name="HTTP"/>
<set-variable variableName="queryStringIncompleto" value="#[message.inboundProperties.'host']/logTicket?ipFrom=#[message.inboundProperties.'http.remote.address']&requestSize=#[message.inboundProperties.'http.request.uri'.length()]&url=#[message.inboundProperties.'host']#[message.inboundProperties.'http.request.uri'.replaceAll("&", "%26")]&userName=#[message.inboundProperties.'authorization']&modifiedRequestSize=#[message.inboundProperties.'http.request.uri'.length()]" doc:name="QueryString LogTicket"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties.'http.request.uri' == '/services/Autentic?wsdl']">
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'http.method']" doc:name="QueryString LogBilhetagem"/>
<cxf:proxy-service namespace="logTeste.gov" service="AutenticacaoServico" payload="envelope" wsdlLocation="${targetServerLog}/servicos/v2/Autentic.svc?singleWsdl" soapVersion="1.2" doc:name="CXF"/>
</when>
<otherwise>
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'SOAPAction'.replaceAll("\"", "")]" doc:name="QueryString LogTicket"/>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="SOAPAction" value="#[message.inboundProperties.'SOAPAction']"/>
</message-properties-transformer>
<outbound-endpoint exchange-pattern="request-response" address="${targetServerLog}/servicos/v2/Autentc.svc" encoding="UTF-8" mimeType="text/xml" doc:name="Generic"/>
</otherwise>
</choice>
<response>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="Content-Type" value="text/xml"/>
</message-properties-transformer>
</response>
我正在使用 mule 3.4.0 CE 来代理远程 Web 服务,但是对于新的 3.7.0 CE,我找不到任何这种工作流程的示例,所以我可以使用 http 共享连接器,有什么线索吗?
不适用于基于 C# 的使用者的示例:
<flow name="Test">
<http:listener config-ref="HTTP_Listener_Configuration" path="/services/teste/teste" doc:name="HTTP"/>
<logger message="AutenticacaoServicoFlowTesteHttp - #[message]" level="INFO" doc:name="Logger"/>
<response>
<logger message="ATestHttp - response - #[message]" level="INFO" doc:name="Logger"/>
</response>
<set-variable variableName="queryStringIncompleto" value="#[message.inboundProperties.'host']/logTicket?ipFrom=#[message.inboundProperties.'http.remote.address']&requestSize=#[message.inboundProperties.'http.request.uri'.length()]&url=#[message.inboundProperties.'host']#[message.inboundProperties.'http.request.uri'.replaceAll("&", "%26")]&userName=#[message.inboundProperties.'authorization']&modifiedRequestSize=#[message.inboundProperties.'http.request.uri'.length()]" doc:name="QueryString LogTicket"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties.'http.request.uri' == '/services/Autentic?wsdl']">
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'http.method']" doc:name="QueryString LogBilhetagem"/>
<cxf:proxy-service namespace="logTeste.gov" service="AutenticacaoServico" payload="envelope" wsdlLocation="${targetServerLog}/servicos/v2/Autentic.svc?singleWsdl" soapVersion="1.2" doc:name="CXF"/>
</when>
<otherwise>
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'SOAPAction'.replaceAll("\"", "")]" doc:name="QueryString LogTicket"/>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="SOAPAction" value="#[message.inboundProperties.'SOAPAction']"/>
</message-properties-transformer>
<outbound-endpoint exchange-pattern="request-response" address="${targetServerLog}/servicos/v2/Autentc.svc" encoding="UTF-8" mimeType="text/xml" doc:name="Generic"/>
</otherwise>
</choice>
<set-variable variableName="payloadLog" value="#[message.payloadAs(java.lang.String)]" doc:name="Guarda Payload Log"/>
<outbound-endpoint exchange-pattern="request-response" address="https://teste:teste@#[flowVars.queryString]" doc:name="Log Bilhetagem"/>
<set-payload value="#[flowVars.payloadLog]" doc:name="Set Payload"/>
<response>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="Content-Type" value="text/xml"/>
</message-properties-transformer>
</response>
</flow>
在大多数使用此 WS 的 C# 应用程序中,第一个连接正常,第二个连接超时...
您尝试代理服务的方式不是理想的方式,在 3.4 中也不是理想的方式,请参阅以下文档页面:
https://developer.mulesoft.com/docs/display/current/Proxying+Web+Services+with+CXF https://developer.mulesoft.com/docs/display/current/Web+Service+Proxy+Pattern
这是代理网络服务的两种标准方式。
好的,找到问题并解决了,不是实施,我所做的是将 WS 重定向到正确的位置,但我还将消息记录到另一个 WS,这将挂起流程并且无法执行对很多方法的级联调用。 所以我只是拿出第二个出站来记录消息,我将使用另一种方法来记录消息。
代码:
<flow name="Test">
<http:listener config-ref="HTTP_Listener_Configuration" path="/services/teste/teste" doc:name="HTTP"/>
<set-variable variableName="queryStringIncompleto" value="#[message.inboundProperties.'host']/logTicket?ipFrom=#[message.inboundProperties.'http.remote.address']&requestSize=#[message.inboundProperties.'http.request.uri'.length()]&url=#[message.inboundProperties.'host']#[message.inboundProperties.'http.request.uri'.replaceAll("&", "%26")]&userName=#[message.inboundProperties.'authorization']&modifiedRequestSize=#[message.inboundProperties.'http.request.uri'.length()]" doc:name="QueryString LogTicket"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties.'http.request.uri' == '/services/Autentic?wsdl']">
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'http.method']" doc:name="QueryString LogBilhetagem"/>
<cxf:proxy-service namespace="logTeste.gov" service="AutenticacaoServico" payload="envelope" wsdlLocation="${targetServerLog}/servicos/v2/Autentic.svc?singleWsdl" soapVersion="1.2" doc:name="CXF"/>
</when>
<otherwise>
<set-variable variableName="queryString" value="#[flowVars.queryStringIncompleto]&method=#[message.inboundProperties.'SOAPAction'.replaceAll("\"", "")]" doc:name="QueryString LogTicket"/>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="SOAPAction" value="#[message.inboundProperties.'SOAPAction']"/>
</message-properties-transformer>
<outbound-endpoint exchange-pattern="request-response" address="${targetServerLog}/servicos/v2/Autentc.svc" encoding="UTF-8" mimeType="text/xml" doc:name="Generic"/>
</otherwise>
</choice>
<response>
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="Content-Type" value="text/xml"/>
</message-properties-transformer>
</response>