Web Service 网关故障诊断技巧
使用下面的一组特定技巧来帮助您对使用 Web Service 网关时遇到的问题进行故障诊断。
为了帮助您确定并解决与 Web Service 网关相关的问题,请使用 WebSphere® Application Server 跟踪和日志记录工具(如设置组件跟踪 (CTRACE)中所述)。
要对网关启用跟踪,请将应用程序服务器跟踪字符串设置为 com.ibm.ws.sib.webservices.*=all=enabled:com.ibm.ws.wsgw.*=all=enabled。如果遇到您认为可能与网关相关的问题,那么可在 WebSphere Application Server 管理控制台中以及在应用程序服务器的 SystemOut.log 文件中检查错误消息。您还可以启用应用程序服务器调试跟踪来提供详细的异常转储。
Web Service 网关是在支持服务集成总线的 Web Service 的基础上作为管理层实现的。因此,使用网关时遇到的大多数已知问题实际与支持总线的 Web Service 相关,这些问题已记录在支持总线的 Web Services 故障诊断技巧中。
WebSphere Application Server 系统消息是从各种来源(包括应用程序服务器组件和应用程序)记录的。由应用程序服务器组件和相关 IBM 产品记录的消息以唯一消息标识开头,此标识指示了发出该消息的组件和应用程序。Web Service 网关组件的前缀是 CWWSG,支持总线的 Web Service 组件的前缀是 CWSWS。
故障诊断者参考:消息主题包含有关网关和支持总线的 Web Service 消息(按消息前缀建立了索引)的信息。每条消息都提供了问题说明以及有关任何可以用来解决该问题的操作的详细信息。
- 如果直接将消息传递至总线目标,那么缺省 RPC 编码 Web Service 字符串数组消息将无法与某些目标服务提供程序成功进行互操作
- SOAP over JMS Web Service 消息由 Web Service 网关作为 JmsBytesMessage 而不是 JmsTextMessage 发送
- 如果创建网关服务,那么直到您尝试通过 Web 浏览器访问该网关服务的 WSDL 文件时,才会在 SDO 存储库中创建 WSDL 描述
- 将网关从 WebSphere Application Server V5.1 迁移到更高版本
- 根据目标服务(而不是网关服务)的 WSDL 来生成 Web Service 客户机
- 将包含过滤器的网关从 WebSphere Application Server V5.1 迁移至更高版本后,过滤器将不再工作
- 将包含过滤器的网关从 WebSphere Application Server V5.1 迁移至 V7.0 或更高版本时,会创建名称以 StorageQueue 结尾的目标
- 客户机应用程序在 WebSphere Application Server V5.1 下正常工作,但在更高版本中工作时发生请求或响应格式不良导致的问题
- WebSphere Application Server V5.1 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service
- 管理控制台中的网关面板仅在 WebSphere Application Server Network Deployment 中可用
如果直接将消息传递至总线目标,那么缺省 RPC 编码 Web Service 字符串数组消息将无法与某些目标服务提供程序成功进行互操作
- 所生成的缺省 RPC 编码 Web Service 字符串数组消息可能无法成功地与某些目标服务提供程序进行互操作。
- 所生成的字符串数组消息并非与能够成功地进行互操作的标准 JAX-RPC 消息完全相同。
- 服务集成总线消息:
<partname env:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/ xsi:type='ns1:ArrayOf_xsd_string'> <item xsi:type='xsd:anySimpleType'>namevalue</item> </partname>
- JAX-RPC 客户机消息:
<partname xsi:type="soapenc:Array" soapenc:arrayType="xsd:string[1]"> <item>namevalue</item> </partname>
- 启动管理控制台。
- 浏览至,然后单击新建。
- 创建以下 JVM 定制属性。请注意,显示的值是区分大小写的。
- 名称:com.ibm.websphere.sib.webservices.useTypeSoapArray
- 值:true
- 重新启动应用程序服务器。
SOAP over JMS Web Service 消息由 Web Service 网关作为 JmsBytesMessage 而不是 JmsTextMessage 发送
缺省情况下,在 WebSphere Application Server V6 或更高版本上,SOAP over JMS Web Service 消息由 Web Service 网关作为 JmsBytesMessage 发送,而在 WebSphere Application Server V5.1 上,Web Service 网关将该消息作为 JmsTextMessage 发送。
- 启动管理控制台。
- 浏览至,然后单击新建。
- 创建以下 JVM 定制属性。请注意,显示的值是区分大小写的。
- 名称:com.ibm.ws.sib.webservices.useSOAPJMSTextMessages
- 值:true
- 重新启动应用程序服务器。
如果创建网关服务,那么直到您尝试通过 Web 浏览器访问该网关服务的 WSDL 文件时,才会在 SDO 存储库中创建 WSDL 描述
每个网关服务都有相关联的入站服务。网关服务 WSDL 文件与此入站服务相关联。并且,仅当消息源于入站服务时,才需要使用此文件。因此,仅当入站服务第一次调用 WSDL 描述时,或者第一次通过 Web 浏览器调用 WSDL 描述时,才会在 SDO 存储库中创建该描述。
如果应用程序正在从除入站服务以外的源将消息发布到总线(例如,如果您正在使用调解处理程序来处理发送至网关服务或者从网关服务发送的 SDO 消息),那么该应用程序应该使用与目标(出站)服务相关联的 WSDL 或者某些其他兼容的 WSDL。
将网关从 WebSphere Application Server V5.1 迁移到更高版本
当 V5 网关生成网关服务的 WSDL 时,生成的名称空间包含服务名。例如:namespace=“http://griddev:9080/wsgw#yourService”。 但是,在更高版本中,为网关服务生成的 WSDL 未包含服务名称。例如:namespace=“http://griddev:9080/wsgw”。
如果 WSDL 绑定和编码样式是文档字面值,那么,由于文档字面值样式不使用 namespace 属性,所以客户机仍能够使用已迁移的网关。但是,如果已使用 V5.1 网关服务 WSDL 来生成 Web Service 客户机,并且 WSDL 绑定和编码样式不是文档字面值,那么在迁移之后,您必须使用新的网关服务 WSDL 来重新生成客户机存根。
根据目标服务(而不是网关服务)的 WSDL 来生成 Web Service 客户机
选择根据目标服务的 WSDL 来生成 Web Service 客户机的好处是,仅仅通过在生成的存根中更改 URL,就可以在直接访问目标服务与通过网关访问目标服务之间进行切换。要在此版本的网关中启用此方法,请使用管理控制台对每个与网关服务相关联的入站服务将定制属性 com.ibm.websphere.wsgw.mapSoapBodyNamespace 设置为 false。
- 如果要保留灵活性以便通过在生成的存根中更改 URL 来重新路由消息,请将定制属性 com.ibm.websphere.wsgw.mapSoapBodyNamespace 设置为 false。
- 如果不再需要此灵活性,请使用更高版本的网关服务 WSDL 来重新生成客户机存根。
将包含过滤器的网关从 WebSphere Application Server V5.1 迁移至更高版本后,过滤器将不再工作
建议不要在 V5.1.1 中使用过滤器,并且已在 V7.0 中移除对过滤器的支持。 以前由过滤器扮演的角色,现在由 JAX-RPC 处理程序与服务集成总线调解的组合承担。 如果您迁移包含路由过滤器的 Web Service 网关,那么可以重新创建过滤器功能。
将包含过滤器的网关从 WebSphere Application Server V5.1 迁移至 V7.0 或更高版本时,会创建名称以 StorageQueue 结尾的目标
这些附加目标是支持 V6 环境中的现有 V5.1 网关过滤器所需的。网关过滤器不再受支持,因此 V7.0 或更高版本 中不再需要这些“StorageQueue”目标。但是,当您迁移至 V7.0 或更高版本 或删除网关实例时,不会自动移除这些目标。
- 如果指定 -Q 参数(共享过滤器相关队列名称),那么会创建指定名称的单个队列目标(如果该目标不存在),并且此目标由具有关联过滤器的所有网关服务共享。
- 如果未指定 -Q 参数,那么会为具有关联过滤器的每个网关服务创建单独的队列目标。这些目标中的每个目标都具有根据相应网关服务请求和应答目标派生的名称,并且这些名称都以 StorageQueue 结尾。
删除网关实例后,请按名称标识每个相关联的存储队列目标,并按删除非主题空间总线目标中描述的方式删除它。
客户机应用程序在 WebSphere Application Server V5.1 下正常工作,但在更高版本中工作时发生请求或响应格式不良导致的问题
与 WebSphere Application Server V5.1 相比,支持总线的 Web Service 将更彻底地检查 Web Service 消息的有效性。因此,某些使用了格式不良的请求或响应(消息部件的名称不正确)的客户机应用程序能够在 V5.1 中正常运行,但在更高版本中却被识别为格式不良。有关解决此问题要采取的步骤,请参阅是否允许格式不良的 SOAP 消息
WebSphere Application Server V5.1 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service
WebSphere Application Server V5.1 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service。在目标 MQ Series 队列上不需要用户标识或密码。将应用程序服务器迁移到更高版本之后,在使用缺省消息传递时,客户机请求将失败,这是因为现在已经启用了基本认证。
SibMessage W [:] CWSIT0009W: A client request failed in the application
server with endpoint <endpoint_name> in bus your_bus with reason:
CWSIT0016E: The user ID null failed authentication in bus your_bus.
要了解用于解决此问题的步骤,请参阅以下服务集成技术故障诊断技巧:将 V5.1 应用程序服务器迁移到 WebSphere Application Server V7.0 或更高版本
管理控制台中的网关面板仅在 WebSphere Application Server Network Deployment 中可用
- 使用 Jython:
wsgwAttribs = [] wsgwAttribs.append(["name", wsgwName]) wsgwAttribs.append(["wsdlServiceNamespace", wsgwNamespace]) wsgw = AdminConfig.create("WSGWInstance", bus, wsgwAttribs ) wsgwWsdlAttribs = [] wsgwWsdlAttribs.append(["WSDLLocation", wsgwWsdlLocation]) AdminConfig.create("SIBWSWSDLLocation", wsgw, wsgwWsdlAttribs, "defaultProxyWSDLLocation" )
- 使用 Jacl:
set wsgwAttribs {} lappend wsgwAttribs [list “name” $wsgwName] lappend wsgwAttribs [list “wsdlServiceNamespace” $wsgwNamespace] set wsgw [$AdminConfig create “WSGWInstance” $bus $wsgwAttribs] set wsgwWsdlAttribs {} lappend wsgwWsdlAttribs [list “WSDLLocation” $wsgwWsdlLocation] $AdminConfig create “SIBWSWSDLLocation” $wsgw $wsgwWsdlAttribs “defaultProxyWSDLLocation”