使用 Apache Axis 1.x 呼叫 .NET (ASMX) WebService,展示關鍵設定:SOAPActionURI、QName 命名空間、參數型別對應。
try {
// 1. WSDL 位址
String url = "https://192.168.12.106/yhcapp/MesServerMng.asmx?wsdl";
// 2. 建立 Axis Service 與 Call
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(url));
// 3. 設定操作名稱:QName(命名空間, 方法名)
// 命名空間來自 WSDL targetNamespace
call.setOperationName(new QName(
"https://www.hustcad.com/InteCAPP/XMLWEBServices/",
"Mes_ProjectInfo"
));
// 4. 新增參數:QName(命名空間, 參數名), XMLType, 參數模式
call.addParameter(
new QName("https://www.hustcad.com/InteCAPP/XMLWEBServices/", "ProjectNo"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN
);
// 5. 設定返回型別
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
// 6. 【關鍵】設定 SOAPAction URI,否則 .NET 端會報錯
call.setSOAPActionURI("https://www.hustcad.com/InteCAPP/XMLWEBServices/Mes_ProjectInfo");
// 7. 呼叫並傳入參數
String projectNo = "要傳入的資料";
String result = (String) call.invoke(new Object[]{projectNo});
System.out.println("返回結果:" + result);
} catch (Exception e) {
System.out.println("呼叫失敗:" + e.getMessage());
e.printStackTrace();
}
| 步驟 | 說明 |
|---|---|
| WSDL URL | .NET ASMX 服務預設提供 ?wsdl 端點 |
| QName 命名空間 | 必須與 WSDL targetNamespace 完全一致,區分大小寫 |
| 參數型別 | 使用 XMLType.XSD_STRING 對應 .NET string;整數用 XSD_INT,日期用 XSD_DATETIME |
| SOAPActionURI | .NET 強制要求,格式通常為 命名空間/方法名,缺失會拋出「Server did not recognize the value of HTTP Header SOAPAction」 |
| 多參數 | call.addParameter() 多次呼叫,invoke(new Object[]{p1, p2, ...}) 依序傳入 |
axis.jar、axis-saaj.jar、commons-discovery.jar、jaxrpc.jar、saaj.jar、wsdl4j.jarsoap:operation soapAction 屬性,確保完全一致targetNamespace 值Axis 1.x 已停止維護,新專案建議使用 JAX-WS (wsimport 生成客戶端) 或 CXF 框架,但維舊專案此範例仍具參考價值。