目录
-
第一部分:基础概念
(图片来源网络,侵删)- 什么是 WebService?
- WebService 的核心标准
- WebService 的工作原理
- WebService vs. REST API
-
第二部分:使用 .NET Framework (传统方式)
- 创建一个简单的 ASMX WebService
- 测试 WebService
- 创建客户端并调用 WebService
-
第三部分:使用现代 .NET (Core / 5+) (推荐方式)
- 为什么选择现代 .NET?
- 创建一个基于 WCF 的 WebService (现代方式)
- 创建一个基于 SOAP 的 Minimal API (高级)
- 创建一个 RESTful Web API (替代方案,也是目前主流)
-
第四部分:进阶主题
- 数据序列化 (XML vs. JSON)
- 安全性考虑
- 部署到 Azure
第一部分:基础概念
什么是 WebService?
WebService 是一种基于 Web 的、跨平台的、自描述的、模块化的应用程序,它可以通过 Web 使用标准的 HTTP 协议进行调用,你可以把它想象成一个“网络上的函数库”,其他应用程序(无论用什么语言编写)都可以通过网络来调用它的功能。

核心特点:
- 跨平台/跨语言:只要能发送 HTTP 请求并解析响应数据,任何语言都可以调用。
- 基于标准:主要依赖 XML、SOAP、WSDL 等开放标准。
- 自描述:通过 WSDL (Web Services Description Language) 文件,WebService 可以描述自己提供的服务、方法、参数和返回值,让客户端轻松了解如何调用它。
WebService 的核心标准
- XML (eXtensible Markup Language):WebService 的数据交换格式,请求和响应都被包装在 XML 文件中。
- SOAP (Simple Object Access Protocol):WebService 的通信协议,它定义了一个标准的消息格式,规定了如何包装 XML 数据、如何通过 HTTP 传输、以及如何处理错误等,SOAP 消息是一个 XML 文档。
- WSDL (Web Services Description Language):WebService 的“说明书”或“接口定义”,它是一个 XML 文件,详细描述了WebService 的所有信息,包括它的地址、可用的方法、每个方法的参数类型和返回值类型等,客户端可以通过 WSDL 文件自动生成调用代码。
- UDDI (Universal Description, Discovery, and Integration):一个“黄页”服务,用于发布和发现 WebService,现在使用较少。
WebService 的工作原理
- 发布:开发者创建一个WebService,并将其部署到 Web 服务器上。
- 发现:客户端通过访问一个特定的 URL(
http://server/Service.asmx?wsdl)来获取 WSDL 文件。 - 代理:客户端工具(如 Visual Studio)根据 WSDL 文件生成一个“代理类”(Proxy Class),这个代理类在本地模拟了远程的WebService,使得调用它就像调用本地方法一样简单。
- 调用:客户端代码调用代理类的方法。
- 封装与传输:代理类将方法调用、参数等信息封装成一个符合 SOAP 标准的 XML 消息(SOAP 请求)。
- HTTP 传输:这个 SOAP 请求通过 HTTP 协议发送到 WebService 的 URL。
- 处理与响应:WebService 服务器接收请求,解析 SOAP 消息,执行相应的业务逻辑,然后将结果封装成另一个 SOAP 响应消息。
- 返回结果:SOAP 响应消息通过 HTTP 返回给客户端。
- 解析:客户端的代理类接收 SOAP 响应,解析 XML 数据,并将结果以客户端期望的数据类型(如对象、字符串等)返回给调用代码。
WebService vs. REST API
虽然都用于 Web 通信,但它们在设计理念上有很大区别。
| 特性 | WebService (SOAP) | REST API |
|---|---|---|
| 协议 | 严格基于 SOAP 协议,通常通过 HTTP/HTTPS。 | 基于 HTTP 协议本身,使用其方法 (GET, POST, PUT, DELETE)。 |
| 数据格式 | 强制使用 XML。 | 主要使用 JSON,也支持 XML、HTML、纯文本等。 |
| 标准化 | 高度标准化(WS-I 规范),有严格的规范(WSDL)。 | 更灵活,没有统一的“标准”,依赖 Roy Fielding 的 REST 架构风格。 |
| 性能 | SOAP 消息冗长,包含大量头信息,性能相对较低。 | JSON 数据量小,解析快,性能更高。 |
| 安全性 | 内置了 WS-Security 等复杂的安全标准。 | 通常依赖于 HTTPS 和 OAuth 等标准 Web 安全机制。 |
| 适用场景 | 企业级应用集成(B2B)、金融、电信等对事务和安全要求极高的场景。 | 移动应用、前后端分离的 Web 应用、公开 API。 |
对于新的 Web 项目,REST API 已经成为绝对的主流,因为它更简单、更轻量、更易于与浏览器和移动端交互,SOAP WebService 仍然在遗留系统和某些特定行业(如银行、政府)中广泛使用。
第二部分:使用 .NET Framework (传统方式)
这部分将教你如何使用 Visual Studio 和 .NET Framework 创建一个经典的 ASMX WebService。

步骤 1:创建项目
- 打开 Visual Studio (VS 2025)。
- 选择 "创建新项目" (Create a new project)。
- 搜索并选择 "ASP.NET Web 应用程序" (.NET Framework)。
- 给项目命名,
ClassicWebService。 - 在下一个窗口中,选择 "Web 服务" 模板,这会自动为你创建一个 ASMX WebService 项目。
步骤 2:添加 WebService 方法
- Visual Studio 会自动创建一个
Service.asmx文件和它的代码后缀Service.asmx.cs。 - 打开
Service.cs文件。 - 默认会有一个
HelloWorld方法,我们来添加一个更实用的方法,比如根据用户名返回问候语。
using System;
using System.Web.Services;
namespace ClassicWebService
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[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
{
[WebMethod]
public string GetWelcomeMessage(string userName)
{
return $"你好, {userName}! 欢迎使用 .NET WebService,当前时间是: {DateTime.Now}";
}
}
}
代码解释:
[WebService]:声明这是一个 WebService。[WebMethod]:标记一个公共方法为 WebService 的可调用方法。只有标记了此属性的方法才能被客户端访问。
步骤 3:测试 WebService
- 在解决方案资源管理器中,右键点击
Service.asmx文件,选择 "在浏览器中查看" (View in Browser)。 - 浏览器会显示一个测试页面,这个页面是根据你的 WSDL 自动生成的。
- 在
GetWelcomeMessage方法下,输入一个名字("张三"),然后点击 "调用" (Invoke) 按钮。 - 页面下方会显示一个 XML 格式的响应,这就是 SOAP 响应的简化视图。
<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">你好, 张三! 欢迎使用 .NET WebService,当前时间是: 2025/10/27 10:30:00</string>
步骤 4:创建客户端并调用
- 在同一个解决方案中,右键点击 "解决方案",选择 "添加" -> "新建项目"。
- 选择 "控制台应用" (.NET Framework),命名为
WebServiceClient。 - 在
WebServiceClient项目中,右键点击 "引用" (References),选择 "添加服务引用" (Add Service Reference)。 - 在弹出的窗口中,点击 "发现" (Discover),Visual Studio 会自动找到当前解决方案中的
Service.asmx。 - 点击 "确定",Visual Studio 会生成代理类和相关配置。
- 打开
Program.cs文件,编写调用代码:
using System;
using ServiceReference1; // 这是添加服务引用后生成的命名空间
namespace WebServiceClient
{
class Program
{
static void Main(string[] args)
{
// 创建 WebService 客户端代理的实例
Service1Client client = new Service1Client();
try
{
// 调用远程方法
string message = client.GetWelcomeMessage("李四");
// 输出结果
Console.WriteLine("从 WebService 收到的消息:");
Console.WriteLine(message);
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
finally
{
// 关闭客户端,释放资源
client.Close();
}
Console.ReadKey();
}
}
}
- 运行
WebServiceClient控制台应用程序,你将看到从 WebService 返回的问候语。
第三部分:使用现代 .NET (Core / 5+) (推荐方式)
现代 .NET (通常指 .NET 5, 6, 7, 8 及更高版本) 不再默认支持 ASMX,对于 SOAP 风格的 WebService,官方推荐使用 WCF (Windows Communication Foundation)。
方案 A:使用 WCF (推荐用于 SOAP)
WCF 是一个功能强大的框架,可以创建多种类型的分布式服务,包括 SOAP WebService。
步骤 1:创建 WCF 服务库
- 创建一个新的项目,选择 "WCF 服务库" (.NET 6/7/8)。
- 项目会包含
IService1.cs(服务接口) 和Service1.cs(服务实现)。
步骤 2:定义服务和实现
打开 IService1.cs,定义你的服务契约。
using System.ServiceModel;
using System.ServiceModel.Web;
// 使用 [ServiceContract] 标记接口
[ServiceContract]
public interface IMyNewService
{
// 使用 [OperationContract] 标记方法
[OperationContract]
string GetWelcomeMessage(string userName);
}
打开 Service1.cs,实现接口。
using System.ServiceModel;
// 实现服务接口
public class MyNewService : IMyNewService
{
public string GetWelcomeMessage(string userName)
{
return $"你好, {userName}! 欢迎使用现代 .NET WCF 服务,当前时间是: {DateTime.Now}";
}
}
步骤 3:配置服务
打开 appsettings.json,添加 WCF 服务端点配置。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"WcfService": {
"BaseAddresses": [
"http://localhost:5001" // 基础地址
]
}
}
打开 Program.cs,注册和托管 WCF 服务。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.ServiceModel;
using System.ServiceModel.Channels;
var builder = WebApplication.CreateBuilder(args);
// 1. 添加 WCF 服务
builder.Services.AddWcf()
.AddService<MyNewService>()
.AddServiceEndpoint<MyNewService, IMyNewService>(new BasicHttpBinding(), "/Service.svc");
var app = builder.Build();
// 2. 映射 WCF 端点
app.UseWcf();
app.Run();
步骤 4:测试和调用
- 运行项目,默认情况下,它可能不会自动打开浏览器,但服务已在
http://localhost:5001上运行。 - 你可以使用
wcftestclient.exe(Windows SDK 自带工具) 来测试,在 "服务" 菜单下,添加服务引用,输入http://localhost:5001/Service.svc?wsdl。 - 客户端调用方式与 .NET Framework 类似,使用
Add Service Reference或ChannelFactory。
方案 B:创建 RESTful Web API (现代主流)
对于绝大多数新项目,RESTful API 是更好的选择,它在现代 .NET 中是原生支持的,非常简单。
步骤 1:创建 Web API 项目
- 创建新项目,选择 "ASP.NET Core Web API"。
- 项目模板会自动为你设置好一切。
步骤 2:创建 Controller
- 在
Controllers文件夹中,右键添加一个 "控制器" -> "API 控制器 - 空"。 - 命名为
ValuesController.cs。
using Microsoft.AspNetCore.Mvc;
namespace ModernWebApi.Controllers
{
[ApiController]
[Route("api/[controller]")] // 路由为 /api/values
public class ValuesController : ControllerBase
{
[HttpGet("welcome/{userName}")] // GET 请求到 /api/values/welcome/张三
public IActionResult GetWelcomeMessage(string userName)
{
var message = $"你好, {userName}! 欢迎使用 .NET Web API,当前时间是: {DateTime.Now}";
return Ok(message); // 返回 200 OK 状态码和 JSON 格式的消息
}
}
}
代码解释:
[ApiController]:启用 API 控制器的特殊行为(如自动模型验证)。[Route("api/[controller]")]:定义控制器级别的路由。[HttpGet("welcome/{userName}")]:定义一个处理 GET 请求的动作,并指定路由模板。{userName}是一个路由参数。return Ok(...):返回一个200 OK的响应,并将对象自动序列化为 JSON。
步骤 3:测试和调用
- 运行项目。
- 浏览器会自动打开 Swagger UI 页面 (地址通常是
https://localhost:7xxx/swagger)。 - 在 Swagger UI 中,你可以看到
GET /api/values/welcome/{userName}这个接口。 - 点击 "Try it out",输入
userName("王五"),然后点击 "Execute"。 - 你会看到返回的 JSON 响应:
"你好, 王五! 欢迎使用 .NET Web API,当前时间是: ..."。
客户端调用:使用任何 HTTP 客户端(如 HttpClient、Postman、curl)即可。
curl "https://localhost:7123/api/values/welcome/赵六"
第四部分:进阶主题
数据序列化
- SOAP (XML):数据结构严格,标签冗长,但 Schema (XSD) 强类型定义非常强大,适合需要严格数据契约的场景。
- REST (JSON):数据结构轻量,易于人阅读和机器解析,是目前 Web 开发的绝对主流,ASP.NET Core 默认使用
System.Text.Json,性能优异。
安全性考虑
- 传输安全:始终使用 HTTPS 来加密所有通信,防止数据在传输过程中被窃听或篡改。
- 身份验证:
- SOAP: WS-Security 标准,支持复杂的令牌(如 SAML)。
- REST: 通常使用 API Key、JWT (JSON Web Token) 或 OAuth 2.0。
- 授权:验证用户身份后,根据其角色或权限决定是否允许访问特定资源,ASP.NET Core Identity 和 Policy-based Authorization 是实现授权的强大工具。
部署到 Azure
将你的 WebService 或 Web API 部署到 Azure 非常简单:
- Azure App Service:这是最常用的选项,它支持 ASP.NET Core、.NET Framework、WCF 和各种其他技术。
- 在 Visual Studio 中右键点击项目 -> "发布"。
- 选择 "Azure" -> "Azure App Service (Windows)",然后按照向导登录并创建/选择服务实例。
- Azure Functions:如果你的服务是基于事件驱动的、无状态的(处理一个 HTTP 请求后完成),Azure Functions 是一个更经济、更轻量级的选择。
- Azure Container Service (AKS):如果你的服务被容器化(Docker),可以部署到 Kubernetes 集群中,实现高可用和弹性伸缩。
总结与建议
| 技术栈 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| .NET Framework ASMX | 极其简单,开发快速。 | 技术老旧,功能有限,只支持 SOAP。 | 维护遗留系统。 |
| .NET WCF | 功能强大,支持多种协议和绑定,安全标准成熟。 | 配置复杂,学习曲线陡峭,在现代 .NET 中不再是焦点。 | 企业内部集成,需要 SOAP 的特定行业(金融、政府)。 |
| .NET Web API (REST) | 现代标准,轻量,高性能,易于与前后端分离,社区庞大。 | 不提供 SOAP 协议。 | 所有新的 Web 应用、移动后端、公开 API。 |
给你的建议:
- 如果你要学习或开发新的项目:请直接学习和使用 .NET Web API (REST),这是业界标准,也是最有价值的技术。
- 如果你需要维护一个旧的 ASMX 项目:了解 .NET Framework ASMX 的知识是必要的。
- 如果你在大型企业中,需要与使用 SOAP 的遗留系统集成:那么学习现代 .NET 中的 WCF 是有价值的。
希望这份详尽的教程能帮助你从零开始掌握 .NET WebService 的开发!
