SOAP WebService 和 RESTful WebService。
调用 C# 的 SOAP WebService
SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,非常严格和正式,传统的 .NET (WCF/ASMX) 服务通常使用 SOAP。
核心步骤:
- 获取 WSDL 文件:这是服务的“说明书”,描述了所有可用的方法、参数和返回值的结构。
- 使用 Java 客户端工具生成调用代码:最常用的是
wsimport(JDK 自带) 或第三方工具如cxf。 - 生成并使用客户端代码:将生成的代码集成到你的 Java 项目中,然后像调用本地方法一样调用远程服务。
详细教程 (以 wsimport 为例)
假设我们有一个 C# 的 SOAP WebService,其地址是 http://www.example.com/MyCSharpService.asmx?wsdl。
第 1 步:获取 WSDL 文件
WSDL 文件通常通过在 WebService URL 后面加上 ?wsdl 参数来访问。
http://www.example.com/MyCSharpService.asmx?wsdl

你需要将这个 URL 提供给 Java 的客户端生成工具。
第 2 步:使用 wsimport 生成客户端代码
打开你的命令行(CMD 或 PowerShell),执行以下命令:
# 基本命令 wsimport -p com.example.client -keep http://www.example.com/MyCSharpService.asmx?wsdl
命令参数说明:

wsimport: JDK 自带的工具,位于 JDK 的bin目录下。-p com.example.client: 指定生成代码的包名,你可以根据需要修改。-keep: 生成代码后,保留编译过程中的.java源文件,方便查看和调试。-d .: 指定编译后的.class文件存放目录,默认是当前目录。-extension: 允许使用一些非标准的扩展,如果遇到生成错误,可以尝试加上这个参数。- WSDL 文件的 URL。
执行成功后,会在你指定的包目录下生成一堆 Java 文件,主要包括:
XXX.java: 对应 WSDL 中定义的portType接口,这是你主要调用的接口。XXXService.java: 服务工厂类,用于获取XXX接口的实例。XXXException.java: 可能抛出的异常类。- 以及一堆用于表示 XML 数据结构的
XXXType.java,XXXObjectFactory.java等。
第 3 步:在 Java 项目中使用生成的代码
- 创建 Java 项目:在你的 IDE(如 IntelliJ IDEA 或 Eclipse)中创建一个新的 Java 项目。
- 添加生成的代码:将
wsimport生成的所有.java文件复制到你的项目中,或者将编译后的.class文件打包成 JAR 文件添加到项目的类路径中。 - 编写调用代码:
import com.example.client.MyCSharpService; // 这是生成的 Service 类
import com.example.client.MyCSharpService_Service; // 这是生成的 Service Factory 类
import com.example.client.YourRequestType; // 假设这是请求参数的类
import com.example.client.YourResponseType; // 假设这是返回结果的类
public class SoapClient {
public static void main(String[] args) {
try {
// 1. 创建服务工厂实例
MyCSharpService_Service service = new MyCSharpService_Service();
// 2. 获取服务端口,即我们定义的接口
MyCSharpService port = service.getMyCSharpServicePort(); // 注意:方法名 getXXXPort() 是 wsimport 生成的标准格式
// 3. 准备请求参数 (根据生成的代码创建对象)
YourRequestType request = new YourRequestType();
request.setName("Java Client");
request.setId(123);
// 4. 调用远程方法
System.out.println("正在调用 C# WebService...");
YourResponseType response = port.yourWebServiceMethod(request); // 替换成你的方法名
// 5. 处理返回结果
System.out.println("调用成功!");
System.out.println("返回结果: " + response.getResult());
} catch (Exception e) {
e.printStackTrace();
System.err.println("调用 WebService 失败: " + e.getMessage());
}
}
}
常见问题与解决方案
-
问题1:
wsimport报错,提示不支持某些 SOAP 扩展。- 解决:尝试在命令中加入
-extension参数。 - 解决:如果问题依旧,可以考虑使用更强大的 Apache CXF 工具,它对标准的支持更好,功能也更丰富。
- 解决:尝试在命令中加入
-
问题2:C# 服务使用 HTTPS,并且有自签名证书。

-
解决:Java 默认不信任自签名证书,你需要配置
JVM的信任库,一种简单的方法(不推荐用于生产)是忽略所有 SSL 证书验证,可以在调用代码前添加以下代码:import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; // 忽略 SSL 证书验证 (仅用于测试!) static { try { TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } }
-
调用 C# 的 RESTful WebService
新建的 .NET Core / .NET 5+ 服务更倾向于使用 RESTful API,它基于 HTTP 协议,使用 JSON 作为数据交换格式,比 SOAP 更轻量、更灵活。
核心步骤:
- 了解 API 端点:知道每个方法的 URL、HTTP 方法(GET, POST, PUT, DELETE)、请求头(如
Content-Type)和请求/响应的 JSON 结构。 - 选择一个 HTTP 客户端库:Java 标准库的
HttpURLConnection比较繁琐,推荐使用第三方库,如 Apache HttpClient 或 OkHttp,这里以 Apache HttpClient 为例。 - 构建请求并发送:使用库构建 HTTP 请求,发送到 C# 服务端,并接收和解析 JSON 响应。
- 处理 JSON:使用如 Jackson 或 Gson 这样的库将 JSON 字符串转换为 Java 对象,或将 Java 对象转换为 JSON 字符串。
详细教程 (Apache HttpClient + Jackson)
假设 C# REST API 的一个端点是:
- URL:
http://www.example.com/api/users - 方法:
POST - 请求头:
Content-Type: application/json - 请求体 (JSON):
{"name": "John Doe", "email": "john.doe@example.com"} - 响应体 (JSON):
{"id": 1, "name": "John Doe", "email": "john.doe@example.com"}
第 1 步:添加 Maven 依赖
在你的 pom.xml 文件中添加以下依赖:
<!-- Apache HttpClient for making HTTP requests -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5-fluent</artifactId>
<version>5.3.1</version>
</dependency>
<!-- Jackson for JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
第 2 步:创建 Java 实体类
为了方便地处理
