ASP.NET WebService 教程
目录
- 第一部分:什么是 WebService?
- 1 核心概念
- 2 为什么使用 WebService?
- 3 WebService 的核心标准(SOAP, WSDL)
- 第二部分:开发环境准备
- 1 软件安装
- 2 创建第一个 ASP.NET WebService 项目
- 第三部分:动手实践 - 创建一个简单的 WebService
- 1 添加 WebService 方法
- 2 理解 ServiceContract 和OperationContract (WCF 模式)
- 3 理解 ASMX 模式(传统方式)
- 第四部分:测试和调用 WebService
- 1 使用内置测试页面
- 2 使用 C# 客户端调用
- 3 使用 JavaScript (jQuery AJAX) 调用
- 第五部分:进阶主题
- 1 传递复杂数据(对象/类)
- 2 传递和接收数据集
- 3 异步方法
- 第六部分:重要注意事项与最佳实践
- 1 ASMX vs. WCF vs. Web API
- 2 安全性考虑
- 第七部分:总结
第一部分:什么是 WebService?
1 核心概念
WebService 是一种跨编程语言、跨操作系统的远程通信技术,它允许不同的应用程序通过网络(通常是 HTTP/HTTPS)相互交换数据或调用对方的功能。

你可以把它想象成一个“网络上的函数库”,你的应用程序(客户端)可以像调用本地函数一样,去调用部署在另一台服务器上的“函数”(WebService 方法)。
2 为什么使用 WebService?
- 系统集成:将不同技术栈构建的系统(如 Java 应用、PHP 网站、.NET 桌面应用)集成在一起。
- 代码复用:将通用的业务逻辑(如用户验证、数据计算、天气查询)封装成 WebService,供多个应用调用,避免重复开发。
- 跨平台通信:基于开放标准,任何能发送 HTTP 请求并解析 XML 的平台都可以消费你的 WebService。
3 WebService 的核心标准
-
SOAP (Simple Object Access Protocol):
- WebService 的“语言”或“消息格式”,它是一种基于 XML 的协议,用于在 Web 上交换结构化信息。
- SOAP 消息包含三个部分:
Envelope(必需,包装整个消息)、Header(可选,包含元数据)、Body(必需,包含实际的应用数据)。 - 即使 SOAP 名字里有 "Simple",但它非常标准和健壮,支持事务、安全等复杂特性。
-
WSDL (Web Services Description Language):
- WebService 的“说明书”或“接口文档”,它是一个 XML 文件,描述了 WebService 的所有信息:
- 可用哪些方法(操作)。
- 每个方法的参数(输入)和返回值(输出)是什么类型。
- 如何访问这个 WebService(URL、协议等)。
- 客户端可以通过解析 WSDL 文件,自动生成调用 WebService 所需的代理类,无需关心底层实现细节。
- WebService 的“说明书”或“接口文档”,它是一个 XML 文件,描述了 WebService 的所有信息:
第二部分:开发环境准备
1 软件安装
你需要安装 Visual Studio,推荐使用较新的版本,如 Visual Studio 2025,但它也完全支持创建和运行旧的 ASMX 项目。

- Visual Studio Community (免费版): https://visualstudio.microsoft.com/zh-hans/vs/community/
- 在安装时,确保选择 “.NET 桌面开发” 或 “ASP.NET 和 Web 开发” 工作负载,这会包含所有必要的组件。
2 创建第一个 ASP.NET WebService 项目
在现代 Visual Studio 中,创建传统 ASMX WebService 的选项可能被隐藏,请按以下步骤操作:
- 打开 Visual Studio,选择“创建新项目”。
- 在搜索框中输入
ASP.NET Web 应用程序,然后选择它,点击“下一步”。 - 为你的项目命名,
MyFirstWebService,然后点击“创建”。 - 在弹出的“创建新 ASP.NET Web 应用程序”窗口中,选择“空”模板。
- 在“附加信息”部分,将框架选择为 .NET Framework(.NET Framework 4.8),不要选 .NET 5/6/7/8。
- 点击“创建”。
你已经有了一个空的 ASP.NET Web 项目。
第三部分:动手实践 - 创建一个简单的 WebService
1 添加 WebService 方法
- 在“解决方案资源管理器”中,右键点击你的项目名称,选择“添加” -> “新建项”。
- 在“添加新项”窗口中,选择“Web 服务 (ASMX)”。
- 将文件名命名为
Service1.asmx,然后点击“添加”。
Visual Studio 会为你创建一个 Service1.asmx 文件和一个对应的 Service1.asmx.cs 代码隐藏文件。
- 打开
Service1.asmx.cs文件,你会看到默认的代码:
using System;
using System.Web.Services; // 引入命名空间
namespace MyFirstWebService
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")] // WebService 的命名空间
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
public Service1 ()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
代码解释:

[WebService(...)]: 这是一个特性,用于标记这个类是一个 WebService。Namespace属性是这个服务的唯一标识符,默认是http://tempuri.org,在实际项目中应该修改为更有意义的 URI,http://yourcompany.com/webservices/。[WebMethod]: 这是最重要的特性,它将一个公共方法暴露为 WebService 的一个可调用的操作,只有标记了[WebMethod]的方法才能被远程客户端访问。
让我们添加我们自己的方法,在 HelloWorld 方法下面添加:
[WebMethod]
public string AddTwoNumbers(int a, int b)
{
return $"The sum of {a} and {b} is: {a + b}";
}
2 理解 ASMX 模式(传统方式)
上面的代码就是最传统的 ASMX 方式,它直接继承自 System.Web.Services.WebService,并使用 [WebMethod] 特性,这是 .NET Framework 早期提供的 WebService 技术。
3 理解 ServiceContract 和 OperationContract (WCF 模式)
虽然我们的目标是 ASMX,但了解更现代的 WCF (Windows Communication Foundation) 模式也很有帮助,因为概念相似。
WCF 不使用 [WebMethod],而是使用:
[ServiceContract]: 标记一个接口或类作为服务的契约。[OperationContract]: 标记接口中的方法作为服务的一个操作。
WCF 示例 (仅作对比):
using System.ServiceModel; // WCF 命名空间
[ServiceContract(Namespace = "http://mycompany.com/webservices")]
public IMyWcfService
{
[OperationContract]
string AddTwoNumbers(int a, int b);
}
// 实现类
public class MyWcfService : IMyWcfService
{
public string AddTwoNumbers(int a, int b)
{
return $"The sum of {a} and {b} is: {a + b}";
}
}
对于初学者和快速集成,ASMX 仍然非常简单有效。
第四部分:测试和调用 WebService
1 使用内置测试页面
这是 ASMX 最方便的特性之一。
-
按
F5或点击 Visual Studio 工具栏上的“播放”按钮来运行你的项目。 -
浏览器会自动打开一个页面,显示你的 WebService 的可用方法列表。
-
点击
AddTwoNumbers链接。 -
你会看到一个测试页面,有两个输入框
a和b,输入一些数字,10和20。 -
点击“调用”按钮。
-
页面下方会显示一个 XML 格式的响应,这正是 SOAP 请求和响应的简化视图。
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">The sum of 10 and 20 is: 30</string>
这证明了你的 WebService 已经成功创建并可以运行!
2 使用 C# 客户端调用
我们创建一个控制台应用程序来调用这个 WebService。
- 在同一个解决方案中,右键点击“解决方案”,选择“添加” -> “新建项目”。
- 选择“控制台应用 (.NET Framework)”,命名为
WebServiceClient。 - 在“解决方案资源管理器”中,右键点击
WebServiceClient项目,选择“添加” -> “服务引用”。 - 在弹出的窗口中,点击“高级”。
- 在“高级”窗口中,点击“添加 Web 引用”。
- 在 URL 框中,粘贴你的 WebService 的地址(通常是
http://localhost:xxxx/Service1.asmx),然后点击“前往”。 - 成功后,Web 引用名称会显示出来(默认是
localhost),你可以修改它,例如改为MyWebServiceRef,然后点击“添加引用”。 - 打开
Program.cs,编写调用代码:
using System;
namespace WebServiceClient
{
class Program
{
static void Main(string[] args)
{
// 1. 创建 WebService 代理类的实例
MyWebServiceRef.Service1SoapClient client = new MyWebServiceRef.Service1SoapClient();
// 2. 像调用本地方法一样调用远程方法
string result = client.AddTwoNumbers(100, 250);
// 3. 显示结果
Console.WriteLine("调用结果: " + result);
Console.ReadKey();
}
}
}
运行这个控制台应用程序,你会在控制台看到输出:调用结果: The sum of 100 and 250 is: 350。
3 使用 JavaScript (jQuery AJAX) 调用
在现代 Web 应用中,通过 JavaScript 调用 WebService 非常常见。
- 回到你的
MyFirstWebServiceWeb 项目。 - 在项目中添加一个 HTML 页面,
Default.html。 - 在 HTML 中添加一些输入控件和按钮,并引入 jQuery 库。
<!DOCTYPE html>
<html>
<head>调用 ASMX WebService</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h2>使用 jQuery 调用 WebService</h2>
<input type="number" id="num1" placeholder="输入第一个数" />
<input type="number" id="num2" placeholder="输入第二个数" />
<button id="addButton">相加</button>
<h3>结果:</h3>
<p id="result"></p>
<script>
$(document).ready(function () {
$("#addButton").click(function () {
var a = parseInt($("#num1").val());
var b = parseInt($("#num2").val());
// 重要:需要启用 [ScriptService] 特性
// 在 Service1.asmx.cs 中取消注释这行: [System.Web.Script.Services.ScriptService]
$.ajax({
type: "POST",
url: "Service1.asmx/AddTwoNumbers",
data: "{'a': " + a + ", 'b': " + b + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
// response.d 是 ASP.NET AJAX 的约定
$("#result").text(response.d);
},
error: function (xhr, status, error) {
$("#result").text("发生错误: " + error);
}
});
});
});
</script>
</body>
</html>
关键点:
- 你必须在
Service1.asmx.cs文件中取消注释[System.Web.Script.Services.ScriptService]特性,否则 AJAX 调用会失败。 url是相对于当前页面的 WebService 方法路径。data参数必须是 JSON 格式的字符串。success回调函数中的response.d是 ASP.NET AJAX 的一个约定,d属性包含了实际返回的数据。
第五部分:进阶主题
1 传递复杂数据(对象/类)
WebService 可以轻松地在客户端和服务器之间传递自定义对象。
- 在你的 WebService 项目中创建一个 C# 类,
User.cs:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
在你的 WebService 中添加一个使用该类的方法:
[WebMethod]
public string GetUserInfo(User user)
{
return $"用户名: {user.Name}, 年龄: {user.Age}";
}
客户端(无论是 C# 还是 JavaScript)会自动序列化和反序列化这个 User 对象。
2 传递和接收数据集
对于需要返回多行数据的场景,DataSet 或 DataTable 是一个经典的选择。
using System.Data;
using System.Data.SqlClient;
[WebMethod]
public DataSet GetProductList()
{
string connectionString = "你的数据库连接字符串";
string query = "SELECT ProductID, ProductName FROM Products";
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(query, con))
{
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
sda.Fill(ds, "Products");
return ds;
}
}
}
}
客户端会收到一个包含 Products 表的 XML 格式 DataSet。
3 异步方法
为了避免在处理耗时操作时阻塞 Web 请求,可以使用异步方法。
[WebMethod]
public async Task<string> GetLongRunningDataAsync()
{
// 模拟一个耗时操作
await Task.Delay(5000); // 等待5秒
return "这是长时间操作的结果";
}
注意:异步 WebMethod 需要客户端也支持异步调用。
第六部分:重要注意事项与最佳实践
1 ASMX vs. WCF vs. Web API
| 特性 | ASMX | WCF | Web API |
|---|---|---|---|
| 技术 | 早期技术,基于 SOAP 和 HTTP | 统一框架,支持多种协议 (HTTP, TCP, MSMQ 等) | 基于 RESTful 架构,使用 HTTP |
| 消息格式 | 主要是 SOAP | SOAP, JSON, Plain Text 等 | 主要是 JSON, XML |
| 风格 | 面向操作 | 面向服务和操作 | 面向资源 |
| 适用场景 | 维护旧系统;需要简单快速的 SOAP 服务。 | 企业级应用,需要复杂通信协议和安全特性。 | 构建现代、轻量级的 Web API 和移动后端服务。 |
| 推荐度 | 不推荐用于新项目 | 功能强大但配置复杂,新项目较少使用 | 目前构建 Web API 的首选 |
对于全新的项目,如果需要构建服务,优先考虑 ASP.NET Core Web API,如果你需要维护或扩展现有的 ASMX 服务,本教程的知识仍然非常有用。
2 安全性考虑
- 认证和授权:默认情况下,ASMX WebService 是开放的,你需要使用 Windows 身份验证、Forms 身份验证或自定义机制来保护它们。
- 输入验证:永远不要信任来自客户端的数据,对所有输入参数进行严格的验证,防止 SQL 注入、跨站脚本等攻击。
- HTTPS:在生产环境中,始终使用 HTTPS 来加密通信内容,防止数据被窃听。
第七部分:总结
本教程带你走完了 ASP.NET WebService (ASMX) 的完整开发流程:
- 理解了 WebService 的基本概念和核心标准 (SOAP, WSDL)。
- 学会了在 Visual Studio 中创建和配置 ASMX 项目。
- 掌握了如何使用
[WebMethod]特性暴露方法。 - 学会了使用内置页面、C# 客户端和 jQuery AJAX 三种方式来调用和测试 WebService。
- 了解了传递复杂数据、异步方法等进阶用法。
- 明确了 ASMX 在现代开发中的定位和安全性注意事项。
虽然 ASMX 已不再是构建新服务的首选技术,但它在许多遗留系统中仍然扮演着重要角色,掌握它不仅能帮助你维护现有代码,也能让你更好地理解 Web 服务通信的基本原理。
