Web Services Invocation Framework 故障诊断技巧
一组特定提示,用于帮助您对使用 Web Services Invocation Framework (WSIF) 时遇到的问题进行故障诊断。
有关解决 WebSphere® Application Server 级别问题的信息,请参阅诊断问题(使用诊断工具)。
要标识和解决与 WSIF 相关的问题,您可以使用标准的 WebSphere Application Server 追踪和记录工具。如果您遇到认为可能与 WSIF 相关的问题,您可检查 WebSphere Application Server 管理控制台和应用程序服务器 stdout.log 文件中的错误消息。您还可以启用应用程序服务器调试跟踪来提供详细的异常转储。
WSIF (Web Services Invocation Framework) 消息中提供具有每条消息所指的详细信息的 WSIF 运行时系统消息列表。
WSIF - 已知限制中提供了使用 WSIF 时受到的主要已知限制列表。
这里是主要 WSIF 活动的核对表,以及有关与每个活动关联的常见问题的建议:
- 创建服务
手动创建的 Web 服务描述语言 (WSDL) 文件会导致许多问题。为了帮助确保 WSDL 文件有效,请使用工具(例如 WebSphere Studio Application Developer (WSAD))创建 Web Service。
手动创建的 Web 服务描述语言 (WSDL) 文件会导致许多问题。为了帮助确保 WSDL 文件有效,请使用工具(例如 WebSphere Development Studio for System i® (WDS))创建 Web Service。
- 定义传输机制
- 对于 Java™ 消息服务 (JMS),请检查您已正确设置 Java 命名和目录接口 (JNDI),并创建必需的连接工厂和队列。
对于 SOAP,请确保部署描述符文件 dds.xml 是正确的 - 最好是通过使用 WebSphere Studio Application Developer (WSAD) 或类似的工具来创建。
对于 SOAP,请确保部署描述符文件 dds.xml 是正确的 - 最好是通过使用 WebSphere Development Studio for System i (WDS) 或类似的工具来创建。
- 创建客户机 - Java 代码
遵循正确格式创建 WSIF 服务、端口、操作和消息。有关正确代码的示例,请参阅示例:使用 WSIF 来动态调用 AddressBook 样本 Web Service。
- 编译代码(客户机和服务)
- 检查代码的构建路径是正确的,而且它包含正确级别的 JAR 文件。
- 为部署到 Web 服务器而准备的服务创建有效 EAR 文件。
- 部署服务
- 当您安装和部署服务 EAR 文件时,仔细检查部署服务时给出的任何消息。
- 服务器设置和启动
确保 WebSphere Application Server server.policy 文件(在 /properties 目录中)具有正确的安全设置。有关更多信息,请参阅保护 WSIF。
- WSIF 设置
检查是否正确设置了 wsif.properties 文件。有关更多信息,请参阅wsif.properties 文件 - 初始内容。
- 运行客户机
检查您是否已正确定义类路径以包括对您的客户机类、WSIF JAR 文件和任何其他所需 JAR 文件的引用,或者使用 WebSphere Application Server launchClient 工具运行您的客户机(更可取)。
检查您是否已正确定义类路径以包括对您的客户机类、WSIF JAR 文件和任何其他所需 JAR 文件的引用,或者使用 WebSphere Application Server launchClient 工具运行您的客户机(首选)。有关此工具的更多信息,请参阅《开发和部署应用程序》PDF 书籍中的『运行应用程序客户机』一章。
- 运行客户机代码时,接收到“无类定义”错误
- 找不到 WSDL 错误
- Web Service EAR 文件未正确地安装到应用程序服务器中
- 许可权问题或安全错误
- 使用带有多个客户机的 WSIF 会引起 SOAP 语法分析错误
- 如果在不同机器上的应用程序服务器上运行的 JMS 消息传递队列和队列连接工厂使用相同的名称,那么将导致 JNDI 查找错误
- WebSphere Application Server V5 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service
- 当前 WSIF 缺省 SOAP 提供程序(IBM Web Service SOAP 提供程序)不能实现与先前的 (Apache SOAP) 提供程序上运行的服务进行完全互操作
运行客户机代码时,接收到“无类定义”错误
此问题通常表明类路径设置错误。检查是否包含相关的 JAR 文件。
找不到 WSDL 错误
一些可能的原因是:
- 应用程序服务器未运行。
- WSDL 中的服务器位置和端口号不正确。
- WSDL 的格式错误(检查应用程序服务器 stdout.log 文件中的错误消息)。
- 自服务安装以来未重新启动应用程序服务器。
您可能还需要尝试以下检查:
- 您可以从错误消息中指定的位置将 WSDL 装入到您的 Web 浏览器吗?
- 您可以将相应的 WSDL 绑定文件装入到您的 Web 浏览器吗?
Web Service EAR 文件未正确地安装到应用程序服务器中
- 对于 EJB 绑定,请运行 WebSphere Application Server 工具 \bin\dumpnamespace。此工具列出 JNDI 目录的当前内容。
- 对于 SOAP over HTTP 绑定,请打开 http://pathToServer/WebServiceName/admin/list.jsp 页面(如果您已安装 SOAP 管理页面)。此页面列出了当前已安装的所有 Web Service。
- 对于 SOAP over JMS 绑定,请完成以下检查:
- 检查队列管理器是否正在运行。
- 检查是否定义了必需的队列。
- 检查 JNDI 设置。
- 使用 jmsadmin 工具的“显示上下文”选项列出当前的 JNDI 定义。
- 检查远程过程调用 (RPC) 路由器是否正在运行。
许可权问题或安全错误
检查 WebSphere Application Server server.policy 文件(在 /properties 目录中)是否具有正确的安全设置。有关更多信息,请参阅保护 WSIF。
使用带有多个客户机的 WSIF 会引起 SOAP 语法分析错误
必须先确定 Web Service 的作用域,然后再将其部署到 WebSphere Application Server。Web Service 的部署描述符文件 dds.xml 包含以下行:
<isd:provider type="java" scope="Application" ......
您可将 Scope 属性设置为 Application 或 Session。缺省设置是 Application,并且如果每个针对 Web Service 的请求都不要求为比单个实例长的实例提供对象,那么此值是正确的。如果 Scope 设为 Application,那么对象在执行单个实例期间不可用于另一个请求,并且它们在完成时发布。如果您的 Web Service 需要为多个请求提供对象,并且在每个请求中对象是唯一的,那么您必须将 scope 设为 Session。如果 Scope 设为 Session,那么对象在会话使用期限期间不可用于另一个请求,并且它们在会话补全时发布。如果 scope 设为 Application 而不是 Session,那么您可能会遇到下列 SOAP 错误:
SOAPException: SOAP-ENV:ClientParsing error, response was:
FWK005 parse might not be called while parsing.;
嵌套异常为:
[SOAPException: faultCode=SOAP-ENV:Client; msg=Parsing error, response was:
FWK005 parse might not be called while parsing.;
targetException=org.xml.sax.SAXException:
FWK005 parse might not be called while parsing.]
如果在不同机器上的应用程序服务器上运行的 JMS 消息传递队列和队列连接工厂使用相同的名称,那么将导致 JNDI 查找错误
您不应该让不同机器上的应用程序服务器上运行的 JMS 消息传递队列和队列连接功能使用相同的名称,因为 WSIF 始终先查看本地的 JMS 目标,而且仅当它找不到本地的目标时,才会使用全 JNDI 引用。例如,如果您在远程机器上运行 Web Service,而且在本地运行应用程序服务器,其使用相同的名称用于消息传递队列和队列连接工厂,那么 WSIF 将找到并使用本地队列,即使远程 JNDI 目标在 WSDL 服务定义中完整提供。
WebSphere Application Server V5 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service
WebSphere Application Server V5 上运行的 JAX-RPC 客户机使用 SOAP over JMS 来调用在 V5 应用程序服务器上运行的 Web Service。在目标 MQ Series 队列上不需要用户标识或密码。在应用程序服务器迁移到 V6 之后并且使用 V6 缺省消息传递时,客户机请求失败,因为现在已经启用了基本认证。
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 或更高版本
当前 WSIF 缺省 SOAP 提供程序(IBM Web Service SOAP 提供程序)不能实现与先前的 (Apache SOAP) 提供程序上运行的服务进行完全互操作
这是因为 IBM Web Service SOAP 提供程序设计为与符合 JAX-RPC 的 Web Service 进行完全互操作,而 Apache SOAP 无法提供这样的服务。要启用互操作,请修改 Web Service 或 WSIF 缺省 SOAP 提供程序,如WSIF SOAP 提供程序:使用现有应用程序中所述。