首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 與 .NET Web Services 互操作實戰:Axis 與 VS.NET 雙向調用指南

     編輯:Java 相關知識

環境準備

  • Java 端:JBuilder 9 / Tomcat 4.1 + Axis 1.x / JDK 1.4
  • .NET 端:Windows 2000 Server + IIS + VS.NET 2003
  • 核心協議:SOAP 1.1 + WSDL 1.1 + HTTP (WS-I Basic Profile 1.0 相容)

場景一:.NET 客戶端調用 Java Web Service (Axis)

1. JBuilder 建立並發布 Service

  • 遵循 Wizard:`Developing Web Services → tutorials → Creating a simple Web Service`
  • F9 執行專案,瀏覽 `https://localhost:8080/.../services` 列表
  • 點擊 Service 的 **WSDL 連結** 複製 URL (如 `https://host:port/.../Bean1?wsdl`)

2. VS.NET 建立客戶端

  1. 新建 ASP.NET / WinForms 專案
  2. 專案右鍵 `Add Web Reference`
  3. URL 欄貼上 WSDL,名稱輸入 `JavaService`,點擊 `Add Reference`
  4. VS.NET 自動產生 Proxy 類別 (`Reference.map`、`Reference.cs` 等)

3. 呼叫代碼

// C#
JavaService.Bean1 proxy = new JavaService.Bean1();
TextBox1.Text = proxy.getSample().ToString();

✅ 直接運行成功,Axis 預設編碼與 .NET 序列化器相容度高。

場景二:Java 客戶端調用 .NET Web Service (ASMX)

1. VS.NET 建立 ASMX 服務

[WebService(Namespace = "https://www.my.com/SU")]
public class SumService : WebService {
    [WebMethod]
    [SoapRpcMethod(Action = "https://www.my.com/Rpc", 
                   RequestNamespace = "https://www.my.com/SU",
                   ResponseNamespace = "https://www.my.com/SU")]
    public int IntAdd(int a, int b) {
        return a + b;
    }
}

關鍵:`[SoapRpcMethod]` 明確指定 `Action`、`Request/ResponseNamespace`,否則 Java Axis 預設 SOAP Action 不匹配拋異常。

2. JBuilder / Axis 動態調用 (DII 模式)

public class TestDotNetService {
    public static void main(String[] args) {
        try {
            Integer a = 1, b = 2;
            String endpoint = "https://localhost/MyServices/WebServiceTest/SumService.asmx";
            
            Service service = new Service();
            Call call = (Call) service.createCall();
            
            call.setTargetEndpointAddress(new URL(endpoint));
            // 必須與 .NET 端 SoapRpcMethod 完全一致
            call.setOperationName(new QName("https://www.my.com/SU", "IntAdd"));
            
            call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
            call.addParameter("b", XMLType.XSD_INT, ParameterMode.IN);
            call.setReturnType(XMLType.XSD_INT);
            
            call.setUseSOAPAction(true);
            call.setSOAPActionURI("https://www.my.com/Rpc"); // 對應 Action
            
            Integer result = (Integer) call.invoke(new Object[]{a, b});
            System.out.println("Result: " + result); // 輸出 3
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 坑點總結

問題原因解決
SoapAction 不匹配.NET 預設 Action = `Namespace/Method`,Axis 預設不同雙方顯式指定相同 `SOAPAction` URI
命名空間衝突Request/Response Namespace 不一致`[SoapRpcMethod]` 統一指定
資料類型不匹配Axis `XSD_DATE` vs .NET `int`參數類型務必對應 (`XSD_INT`)
複雜類型 (DataSet).NET DataSet 序列化極其複雜避免跨平台傳 DataSet,改用 XML 字串或 POCO/DTO

互操作最佳實踐原則

  1. 契約優先:先定義 WSDL/XSD,雙端分別生成代碼,而非代碼生成 WSDL
  2. 資料類型最小化:僅使用 XML Schema 內建類型 (`string`, `int`, `decimal`, `dateTime`, `base64Binary`)
  3. 文檔風格優於 RPC 風格:`style="document" use="literal"` 相容性最佳
  4. 版本管理:WSDL 命名空間含版本號,破壞性變更新增 Operation 而非修改
  5. 安全性:WS-Security (UsernameToken / X.509) 或 OAuth2 + JWT 保護端點
  6. 現代替代:新專案優先考慮 REST/JSON + OpenAPI 3.0,SOAP 僅維護既有系統
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved