首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 調用 C# WebService (ASMX) 完整指南:從部署到客戶端生成

     編輯:程式設計綜合問答

問題背景

對方提供 C# 寫的舊式 ASMX WebService:bin 目錄含 DLL、web.config、ws.asmx(指向 YC.Controller.API.ControllerWS)、Word 文檔說明接口。Java 端需調用。

核心認知:ASMX 必須部署運行

ASMX 不是 DLL 直接調用的庫,而是運行在 IIS 上的 HTTP 端點。對方給的文件是**部署包**,需在 Windows Server 上部署到 IIS,形成可訪問的 URL(如 https://host:port/Service/ws.asmx),Java 才能通過 HTTP/SOAP 調用。

完整對接流程

1. 服務端部署(對方或運維完成)

  • IIS 創建網站/應用程序,物理路徑指向部署包根目錄;
  • 應用程序池:.NET Framework 4.0+、Integrated 模式;
  • 驗證:瀏覽器訪問 ws.asmx 能看到服務描述頁面、WSDL 鏈接(?wsdl);
  • 防火牆開放端口(默認 80/443)。

2. 獲取 WSDL 並生成 Java 客戶端代碼

WSDL 地址:https://host:port/Service/ws.asmx?wsdl

# 方案一:wsimport (JDK 內置,推薦)
wsimport -keep -p com.example.client "https://host:port/Service/ws.asmx?wsdl"

# 方案二:Maven 插件 (cxf-codegen-plugin)
# pom.xml 添加插件配置,mvn generate-sources 自動生成

# 方案三:IDE 圖形化
# IntelliJ: New > Web Service Client > WSDL URL
# Eclipse: New > Other > Web Services > Web Service Client

生成產物:Service 接口、ServiceSoap 端口接口、請求/響應對象、ObjectFactory、package-info.java 等。

3. Java 調用代碼示例

// 構建服務工廠與端口
Service service = new Service(new URL("https://host:port/Service/ws.asmx?wsdl"), 
                              new QName("https://tempuri.org/", "Service"));
ServiceSoap port = service.getServiceSoap(); // 或 getServiceSoap12()

// 設置超時(針對 JAX-WS RI)
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.CONNECT_TIMEOUT, 5000);
bp.getRequestContext().put(BindingProvider.REQUEST_TIMEOUT, 10000);

// 調用業務方法(根據 WSDL 定義的方法名)
GetUserResponse response = port.getUser(new GetUserRequest("user123"));
System.out.println("用戶: " + response.getUser().getName());

4. 常見坑點與解決

問題原因解決
命名空間不匹配 C# 默認 tempuri.org,Java 生成代碼需一致 檢查 @WebService(targetNamespace="...") 或手動修改生成代碼 QName
日期類型序列化異常 C# DateTime ↔ Java XMLGregorianCalendar 使用 DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar) 轉換
數組/集合為 null C# 返回 List<T> 或 T[],JAXB 生成 List<T> 需初始化 調用前 request.getItems().add(item) 而非 setItems
SOAP 版本不匹配 ASMX 支持 Soap1.1/1.2,端口名不同 嘗試 getServiceSoap() (1.1) 或 getServiceSoap12() (1.2)
中文亂碼 編碼不一致 確保雙方 UTF-8,SOAP 頭聲明 <?xml version="1.0" encoding="UTF-8"?>

替代方案:若對方可改造

  • 升級為 WCF / ASP.NET Core Web API:返回 JSON,Java 用 HttpClient + Jackson/Gson 調用,極大降低複雜度;
  • 提供 REST 門面:在 C# 端薄封裝一層 Controller 轉發調用 ASMX,對外暴露 REST。

總結

Java 調用 C# ASMX 的關鍵在於:**對方必須將服務部署到 IIS 形成可訪問的 WSDL 端點**,Java 端通過 wsimport 生成客戶端存根進行 SOAP 調用。注意命名空間、日期、集合、SOAP 版本等互操作細節。條件允許,強烈建議雙方協商遷移至 REST/JSON 協議。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved