使用 MSXML 组件(最经典、最常用)
这是最传统和普遍的方法,ASP 内置了 MSXML 组件,我们可以利用它来发送 HTTP 请求并解析返回的 XML 响应。

核心步骤:
- 创建 XMLHTTP 对象:用于向 WebService 的 URL 发送 SOAP 请求。
- 构建 SOAP 请求体:手动编写符合目标 WebService 规范的 XML 字符串,你需要知道 WebService 的命名空间、方法名、参数名和类型。
- 设置请求头:关键一步是设置
Content-Type为text/xml和SOAPAction,后者是 WebService 的“方法签名”。 - 发送请求:使用
send()方法将请求体发送到服务器。 - 处理响应:获取服务器返回的 XML 响应。
- 解析 XML 响应:使用
MSXML的 DOM (Document Object Model) 功能来提取你需要的返回值。
详细示例
假设我们要调用一个名为 UserInfoService 的 Java WebService,它有一个方法 getUserInfo,接收一个 String 类型的 userId,返回一个包含用户名和邮箱的复杂对象。
WebService 的 WSDL 地址: http://your-java-server/your-service/UserInfoService?wsdl
获取关键信息
你需要从 WSDL 文件或 WebService 提供方那里获取以下信息:

- Target Namespace (目标命名空间):
http://service.yourcompany.com/ - SOAPAction (操作):
http://service.yourcompany.com/getUserInfo - 方法参数名:
userId - 返回参数的元素名: 返回一个
<getUserInfoResponse>元素,里面包含<return>元素,<return>又包含<name>和<email>。
ASP 代码实现
创建一个 .asp 文件,call_java_service.asp,代码如下:
<%
' Option Explicit 强制声明变量,是好习惯
Option Explicit
' --- 1. 定义变量 ---
Dim xmlhttp, soapRequest, url, userId, responseXML, returnValue, userName, userEmail
' --- 2. 初始化变量 ---
' 要调用的 WebService 地址 (通常是 WSDL 地址,但 SOAP 请求直接发到 endpoint)
url = "http://your-java-server/your-service/UserInfoService"
' 用户ID,假设从某个地方获取
userId = "user123"
' --- 3. 构建 SOAP 请求体 ---
' 注意:这里的命名空间、方法名、参数名必须和 Java WebService 完全一致
soapRequest = "<?xml version=""1.0"" encoding=""utf-8""?>" & _
"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" " & _
"xmlns:ser=""http://service.yourcompany.com/"">" & _
" <soapenv:Header/>" & _
" <soapenv:Body>" & _
" <ser:getUserInfo>" & _
" <!--You may need to change the 'userId' name-->" & _
" <ser:userId>" & userId & "</ser:userId>" & _
" </ser:getUserInfo>" & _
" </soapenv:Body>" & _
"</soapenv:Envelope>"
' --- 4. 创建 MSXML 对象并设置请求头 ---
On Error Resume Next ' 错误处理,防止组件未注册等问题
Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
If Err.Number <> 0 Then
Response.Write "无法创建 MSXML 对象,请检查服务器是否安装,错误: " & Err.Description
Response.End
End If
On Error GoTo 0
' 设置请求超时时间(毫秒)
xmlhttp.setTimeouts 10000, 10000, 10000, 10000
' 发送 POST 请求
xmlhttp.Open "POST", url, False ' False 表示同步请求,等待响应
xmlhat.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
xmlhat.setRequestHeader "SOAPAction", "http://service.yourcompany.com/getUserInfo"
xmlhat.send soapRequest
' --- 5. 检查请求是否成功 ---
If xmlhttp.Status <> 200 Then
Response.Write "WebService 调用失败,HTTP 状态码: " & xmlhttp.Status & "<br>"
Response.Write "响应内容: " & xmlhttp.responseText
Response.End
End If
' --- 6. 解析返回的 XML 响应 ---
Set responseXML = xmlhttp.responseXML
' 检查 XML 是否加载成功
If responseXML.parseError.errorCode <> 0 Then
Response.Write "返回的 XML 格式错误,错误码: " & responseXML.parseError.errorCode & "<br>"
Response.Write "错误原因: " & responseXML.parseError.reason
Response.End
End If
' 使用 SelectNodes 提取数据
' XPath 路径需要根据 WSDL 中定义的实际结构来写
Set returnValue = responseXML.selectNodes("//ser:getUserInfoResponse/ser:return")
If returnValue.length > 0 Then
Dim userNode
Set userNode = returnValue(0)
userName = userNode.selectSingleNode("ser:name").Text
userEmail = userNode.selectSingleNode("ser:email").Text
Response.Write "<h1>用户信息查询成功</h1>"
Response.Write "<p><strong>用户ID:</strong> " & userId & "</p>"
Response.Write "<p><strong>用户名:</strong> " & userName & "</p>"
Response.Write "<p><strong>邮箱:</strong> " & userEmail & "</p>"
Else
Response.Write "未能从响应中解析出用户信息。"
End If
' --- 7. 释放对象 ---
Set xmlhttp = Nothing
Set responseXML = Nothing
Set returnValue = Nothing
%>
使用第三方组件(如 Soap Toolkit)
微软曾经提供过 Microsoft SOAP Toolkit,它提供了一个更高级的 MSSOAP.SoapClient 对象,可以简化调用过程,因为它能帮你处理一些底层的 SOAP 协议细节,但这个工具包比较老旧,不推荐在新项目中使用,且在 64 位系统上可能存在兼容性问题,如果你维护的是一个旧系统,可能会遇到它。
示例代码(概念性):

<%
Dim soapClient
Set soapClient = Server.CreateObject("MSSOAP.SoapClient")
' WSDL 文件路径或 URL
soapClient.ClientProperty("ServerHTTPRequest") = True
soapClient.mssoapinit "http://your-java-server/your-service/UserInfoService?wsdl"
' 直接调用方法,传入参数
Dim result
result = soapClient.getUserInfo("user123")
' result 是一个对象,可以直接访问其属性
Response.Write "用户名: " & result.Name
Response.Write "<br>邮箱: " & result.Email
%>
这种方法更简单,但依赖外部组件,且已过时。
使用 .NET 作为桥接(推荐用于新项目或复杂场景)
如果你的 ASP 应用程序运行在支持 .NET 的环境(如 IIS),或者你有能力部署一个 .NET 的中间件,这是一个非常强大和现代的解决方案。
架构:
ASP 页面 -> HTTP Request -> ASP.NET WebService/ASHX Handler -> Java WebService
优点:
- 调用简单:.NET 调用 Java WebService 非常方便,可以直接添加 Web Service 引用,像调用本地方法一样。
- 类型安全:.NET 会自动生成代理类,将 SOAP 消息转换为 .NET 对象,避免了手动解析 XML 的繁琐和错误。
- 代码健壮:利用 .NET 强大的异常处理和类型系统,代码更可靠。
- 解耦:将 ASP 和 Java 的直接依赖隔离开来,.NET 模块可以独立部署和更新。
实现步骤:
- 创建一个 ASP.NET WebService 或 ASHX Generic Handler。
- 在该 .NET 项目中,添加服务引用(Add Service Reference),指向 Java WebService 的 WSDL 地址。
- 在 .NET 代码中,像调用本地方法一样调用 WebService 方法。
- 在你的 ASP 页面中,使用
ServerXMLHTTP或XMLHTTP组件(和方法一类似)去调用这个本地的 .NET WebService,这样,ASP 只负责展示,复杂的调用逻辑交给 .NET 处理。
