C# WebService 教程
目录
-
第一部分:基础概念
(图片来源网络,侵删)- 什么是 WebService?
- WebService 的核心标准
- C# 中实现 WebService 的几种方式
-
第二部分:使用 ASMX 创建和调用 WebService (入门经典)
- 什么是 ASMX?
- 实战:创建第一个 ASMX WebService
- 实战:调用 ASMX WebService
- ASMX 的优缺点
-
第三部分:使用 WCF 创建和调用 WebService (功能强大)
- 什么是 WCF?
- WCF 的核心概念 (ABC)
- 实战:创建第一个 WCF 服务
- 实战:调用 WCF 服务
- WCF 的优缺点
-
第四部分:现代选择 - ASP.NET Web API
- 为什么选择 Web API?
- Web API 与 WebService 的区别
- 实战:创建一个简单的 Web API
- 实战:调用 Web API (使用 HttpClient)
-
第五部分:总结与如何选择
(图片来源网络,侵删)
第一部分:基础概念
什么是 WebService?
WebService 是一种跨编程语言、跨操作系统的远程调用技术,它允许不同的应用程序通过网络进行交互,就像调用本地方法一样简单。
你可以把它想象成一个“网络上的组件”,你的程序可以请求另一个程序(部署在服务器上)提供的服务,而无需关心对方是用什么语言写的、运行在什么操作系统上。
WebService 的核心标准
WebService 主要基于以下开放标准,确保了其互操作性:
- XML (eXtensible Markup Language): 用于数据交换的格式,WebService 之间传递的数据都被封装在 XML 文件中。
- SOAP (Simple Object Access Protocol): 一种协议,定义了消息的格式和如何通过 HTTP (或其他协议) 来交换这些格式化的消息,SOAP 消息就是一个标准的 XML 包。
- WSDL (Web Services Description Language): 一个 XML 文件,用来描述 WebService 的功能,它告诉客户端:“我有哪些方法可以调用?每个方法需要什么参数?会返回什么类型的数据?”,客户端通过 WSDL 文件来“了解”并调用服务。
- UDDI (Universal Description, Discovery, and Integration): 一个目录服务,用于发布和发现 WebService,可以把它理解成“WebService 的黄页”。
C# 中实现 WebService 的几种方式
微软为 .NET 平台提供了多种技术来创建和使用 WebService,它们各有侧重和演进历程:

- ASMX (ASP.NET Web Services): 最早期、最简单的技术,直接基于 SOAP 和 HTTP,开发非常迅速,是入门级 WebService 的首选。
- WCF (Windows Communication Foundation): 功能极其强大的框架,它不仅仅支持 SOAP,还支持 REST、TCP、Named Pipes等多种协议和编码方式,它是一个“全能选手”,但配置相对复杂。
- ASP.NET Web API: 现代、轻量级的框架,专门用于构建基于 RESTful 风格的 HTTP 服务,它更符合现代 Web 开发的趋势,是构建移动端和前端应用后端服务的首选。
- gRPC: 一个更现代、高性能的框架,使用 Protocol Buffers 作为数据格式和接口定义语言,适合对性能要求极高的微服务架构。
第二部分:使用 ASMX 创建和调用 WebService
什么是 ASMX?
ASMX 是 .NET Framework 中最基础的 WebService 技术,你只需要创建一个继承自 System.Web.Services.WebService 的类,并标记你的方法为 [WebMethod],.NET 就会自动为你处理 SOAP、WSDL 等所有底层细节。
实战:创建第一个 ASMX WebService
环境: Visual Studio (可以是 Visual Studio Community 或 Professional 版本)
步骤:
-
创建项目:
- 打开 Visual Studio,选择 "创建新项目"。
- 搜索并选择 "ASP.NET Web 应用程序"。
- 给项目命名,
AsmxWebServiceDemo。 - 在下一个窗口中,选择 "空" 模板,然后确保勾选了 "为 HTTPS 配置"。
-
添加 WebService 服务:
- 在 "解决方案资源管理器" 中,右键点击你的项目 -> 添加 -> 新建项...。
- 选择 "Web 服务",命名为
UserService.asmx。 - Visual Studio 会自动为你创建一个文件,其中包含默认的代码。
-
编写服务代码: 打开
UserService.asmx.cs文件,编写如下代码:
using System.Web.Services;
namespace AsmxWebServiceDemo
{
/// <summary>
/// UserService 的摘要说明
/// </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 UserService : System.Web.Services.WebService
{
public UserService()
{
// 如果使用设计的组件,请取消注释以下行
// InitializeComponent();
}
[WebMethod]
public string GetUserName(int userId)
{
// 模拟从数据库获取用户名
if (userId == 1)
{
return "张三";
}
else if (userId == 2)
{
return "李四";
}
else
{
return "未知用户";
}
}
[WebMethod]
public int Add(int a, int b)
{
return a + b;
}
}
}
代码解释:
[WebService]: 标记这是一个 WebService。[WebMethod]: 标记这个公共方法是可以通过 Web 调用的,只有标记了此方法,才能被外部访问。Namespace: 服务的命名空间,通常使用http://tempuri.org/作为临时命名空间,发布时应该改为自定义的 URI。
- 测试服务:
- 在
UserService.asmx文件上右键,选择 “在浏览器中查看”。 - 你会看到一个服务说明页面,列出了你定义的两个
[WebMethod]。 - 点击
GetUserName,你会看到它生成了一个测试表单,输入1,然后点击“调用”按钮。 - 页面会返回一个标准的 SOAP 响应的 XML,内容如下:
- 在
<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">张三</string>
恭喜!你的第一个 ASMX WebService 已经成功创建并运行了!
实战:调用 ASMX WebService
我们创建一个客户端来调用刚刚创建的服务。
-
添加客户端项目:
- 在同一个解决方案中,右键点击“解决方案” -> 添加 -> 新建项目...。
- 选择 "控制台应用",命名为
AsmxWebServiceClient。
-
添加 Web 引用:
- 在
AsmxWebServiceClient项目中,右键点击“引用” -> 添加服务引用...。 - 在弹出的窗口中,点击 "高级..." 按钮。
- 在弹出的新窗口中,点击 "添加 Web 引用..."。
- 在 URL 输入框中,粘贴你的 ASMX 服务的地址(
http://localhost:XXXXX/UserService.asmx,XXXXX 是你的端口号)。 - 点击“前往”,服务地址下方的下拉框会显示
UserService。 - 将 Web 引用别名设置为
UserServiceRef,然后点击“添加引用”。
- 在
-
编写调用代码: 打开
Program.cs,编写如下代码:
using System;
namespace AsmxWebServiceClient
{
class Program
{
static void Main(string[] args)
{
// 1. 创建 Web 服务的代理对象
UserServiceRef.UserService service = new UserServiceRef.UserService();
// 2. 调用远程方法
string userName = service.GetUserName(1);
Console.WriteLine($"用户ID为1的用户名是: {userName}");
int sum = service.Add(10, 20);
Console.WriteLine($"10 + 20 = {sum}");
Console.ReadKey();
}
}
}
运行结果:
用户ID为1的用户名是: 张三
10 + 20 = 30
你会发现,调用远程 WebService 的代码和调用本地类的代码几乎一模一样!这就是 WebService 的魅力。
ASMX 的优缺点
- 优点:
- 开发简单: 配置最少,几行代码就能创建一个服务。
- 上手快: 非常适合初学者理解 WebService 的基本概念。
- 自动生成 WSDL: .NET 自动处理所有细节。
- 缺点:
- 功能有限: 主要基于 SOAP,不支持 REST 等现代风格。
- 依赖 IIS: 必须在 IIS (Internet Information Services) 上运行。
- 技术较旧: 已被 WCF 和 Web API 取代,新项目不推荐使用。
第三部分:使用 WCF 创建和调用 WebService
什么是 WCF?
WCF (Windows Communication Foundation) 是微软推出的统一通信平台,它是一个“框架的框架”,将各种网络通信技术(如 ASMX、.NET Remoting、MSMQ、WSE 等)整合在一起,通过配置即可切换通信方式。
WCF 的核心概念 (ABC)
理解 WCF,只需记住三个核心概念:
- A (Address - 地址): 服务在哪里?
http://localhost:8000/MyService/ - B (Binding - 绑定): 如何通信?使用什么协议、编码方式?
basicHttpBinding(类似 ASMX 的 SOAP)、wsHttpBinding(更安全的 SOAP)、webHttpBinding(用于 REST) 等。 - C (Contract - 契约): 提供什么服务?服务有哪些方法?通过接口来定义。
实战:创建第一个 WCF 服务
步骤:
-
创建项目:
- 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为
WcfServiceDemo。 - 选择 “空” 模板。
- 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为
-
添加 WCF 服务:
- 右键项目 -> 添加 -> 新建项...。
- 选择 "WCF 服务",命名为
IWCFUserService.cs(接口) 和WCFUserService.svc.cs(实现)。
-
定义契约 (接口): 打开
IWCFUserService.cs,定义服务接口:
using System.ServiceModel;
namespace WcfServiceDemo
{
// 告诉 WCF 框架这是一个服务契约
[ServiceContract]
public interface IWCFUserService
{
// 告诉 WCF 这是一个操作(方法)
[OperationContract]
string GetUserName(int userId);
}
}
- 实现契约:
打开
WCFUserService.svc.cs,实现接口:
namespace WcfServiceDemo
{
// 告诉 WCF 这个类实现了服务契约
[ServiceBehavior]
public class WCFUserService : IWCFUserService
{
public string GetUserName(int userId)
{
if (userId == 1) return "王五";
return "未知用户";
}
}
}
- 配置绑定:
打开
Web.config文件,在<system.serviceModel>节点下添加服务端点配置:
<system.serviceModel>
<services>
<service name="WcfServiceDemo.WCFUserService">
<!-- 定义服务端点 -->
<endpoint
address=""
binding="basicHttpBinding" <!-- 使用 basicHttpBinding,类似于 ASMX -->
contract="WcfServiceDemo.IWCFUserService" />
</service>
</services>
</system.serviceModel>
- 测试服务:
- 在
WCFUserService.svc文件上右键,选择 “在浏览器中查看”。 - 页面会显示服务信息,并提供了 WSDL 的链接 (
?wsdl),这证明服务已经可以访问。
- 在
实战:调用 WCF 服务
-
添加客户端项目:
- 新建一个 "控制台应用" 项目,命名为
WcfServiceClient。
- 新建一个 "控制台应用" 项目,命名为
-
添加服务引用:
- 右键项目 -> 添加 -> 服务引用...。
- 点击 "发现",Visual Studio 会自动扫描当前解决方案中的 WCF 服务。
- 选择你刚刚创建的
WCFUserService,命名空间设为WcfServiceRef,点击“确定”。
-
编写调用代码: 打开
Program.cs:
using System;
namespace WcfServiceClient
{
class Program
{
static void Main(string[] args)
{
// 创建客户端代理
WcfServiceRef.WCFUserServiceClient client = new WcfServiceRef.WCFUserServiceClient();
// 调用服务
string userName = client.GetUserName(1);
Console.WriteLine($"通过 WCF 获取的用户名是: {userName}");
Console.ReadKey();
}
}
}
运行结果与 ASMX 类似,你会发现调用方式非常一致。
WCF 的优缺点
- 优点:
- 功能强大: 支持多种协议、多种宿主(IIS, Windows 服务, 自定义宿主等)、多种安全模式。
- 灵活性和可扩展性: 通过配置文件可以轻松改变通信方式,无需修改代码。
- 企业级: 提供了事务、消息队列、安全等企业级功能。
- 缺点:
- 学习曲线陡峭: 概念多(ABC, 契约, 绑定, 宿主等),配置复杂。
- 过度设计: 对于简单的 RESTful 服务,WCF 显得过于笨重。
- 配置繁琐: 错误的配置是 WCF 开发中最常见的问题来源。
第四部分:现代选择 - ASP.NET Web API
为什么选择 Web API?
随着移动互联网的兴起,前端(浏览器、手机App)与后端的通信越来越多地采用 RESTful 风格,RESTful API 使用简单的 HTTP 动词(GET, POST, PUT, DELETE)来操作资源,数据格式通常是轻量级的 JSON。
Web API 是专门为构建这种 HTTP 服务而设计的,它比 WCF 更简单、更现代。
Web API 与 WebService 的区别
| 特性 | WebService (ASMX/WCF-SOAP) | ASP.NET Web API |
|---|---|---|
| 协议 | 主要基于 SOAP | 基于 HTTP (RESTful) |
| 数据格式 | XML | JSON (默认), XML, 文本等 |
| 风格 | 面向操作 | 面向资源 |
| 地址 | http://server/service.asmx?wsdl |
http://server/api/products/1 |
| HTTP 动词 | 不直接使用,封装在 SOAP 中 | 直接使用 (GET, POST, PUT, DELETE) |
| 宿主 | IIS (WCF 也可其他) | IIS, 自定义宿主 (OWIN) |
| 主要用途 | 企业应用集成 | Web 前后端分离、移动后端 |
实战:创建一个简单的 Web API
步骤:
-
创建项目:
- 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为
WebApiDemo。 - 在模板选择窗口,选择 "Web API",这个模板会自动帮你配置好所有东西。
- 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为
-
添加模型:
- 右键项目 -> 添加 -> 文件夹,命名为
Models。 - 右键
Models文件夹 -> 添加 -> 类...,命名为Product.cs。
- 右键项目 -> 添加 -> 文件夹,命名为
// Models/Product.cs
namespace WebApiDemo.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
-
创建 API 控制器:
- 右键
Controllers文件夹 -> 添加 -> 控制器...。 - 选择 "Web API 2 控制器 - 空",命名为
ProductsController.cs。
- 右键
-
编写控制器代码: 打开
ProductsController.cs,编写如下代码:
using System.Collections.Generic;
using System.Web.Http;
using WebApiDemo.Models;
namespace WebApiDemo.Controllers
{
public class ProductsController : ApiController
{
// 模拟一个数据源
private List<Product> products = new List<Product>
{
new Product { Id = 1, Name = "笔记本电脑", Price = 5999 },
new Product { Id = 2, Name = "无线鼠标", Price = 99 }
};
// GET: api/products
public IEnumerable<Product> Get()
{
return products;
}
// GET: api/products/5
public IHttpActionResult Get(int id)
{
var product = products.Find(p => p.Id == id);
if (product == null)
{
return NotFound(); // 返回 404 Not Found
}
return Ok(product); // 返回 200 OK 和产品对象
}
}
}
代码解释:
ApiController: 所有 Web API 控制器的基类。HttpGet: 标记此方法响应 HTTP GET 请求。IHttpActionResult: 返回多种标准 HTTP 响应(如 Ok, NotFound, BadRequest)的推荐方式。- 路由由约定决定,
Get()方法对应api/products,Get(id)方法对应api/products/{id}。
- 测试 API:
- 按
F5运行项目,浏览器会打开到api/products。 - 由于浏览器默认发送 GET 请求,你会看到返回的 JSON 数据:
[ { "Id": 1, "Name": "笔记本电脑", "Price": 5999.0 }, { "Id": 2, "Name": "无线鼠标", "Price": 99.0 } ] - 在浏览器地址栏输入
api/products/1,你会看到单个产品的 JSON 数据。
- 按
实战:调用 Web API (使用 HttpClient)
-
创建客户端项目:
- 新建一个 "控制台应用" 项目,命名为
WebApiClient。 - 右键项目 -> 管理 NuGet 程序包...,搜索并安装
Microsoft.AspNet.WebApi.Client包(.NET Core/.NET 5+,则System.Net.Http.Json已内置)。
- 新建一个 "控制台应用" 项目,命名为
-
编写调用代码: 打开
Program.cs:
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json; // .NET Core 3.0+ 推荐使用
using System.Threading.Tasks;
using WebApiDemo.Models; // 需要添加对 WebApiDemo 项目的引用
namespace WebApiClient
{
class Program
{
// HttpClient 应该是单例,这里为了演示简化
static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
// 替换成你的 Web API 运行地址
string baseUrl = "http://localhost:5001/api/"; // 注意端口号
try
{
// 1. 获取所有产品
Console.WriteLine("获取所有产品...");
var allProducts = await client.GetFromJsonAsync<List<Product>>(baseUrl + "products");
foreach (var p in allProducts)
{
Console.WriteLine($"ID: {p.Id}, Name: {p.Name}, Price: {p.Price}");
}
// 2. 获取 ID 为 1 的产品
Console.WriteLine("\n获取 ID 为 1 的产品...");
var product = await client.GetFromJsonAsync<Product>(baseUrl + "products/1");
if (product != null)
{
Console.WriteLine($"找到产品: {product.Name}");
}
else
{
Console.WriteLine("未找到产品。");
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
Console.ReadKey();
}
}
}
注意: 运行此客户端前,请确保你的 WebApiDemo 项目正在运行,并且将 baseUrl 中的端口号修改为你的 Web API 实际运行的端口号。
第五部分:总结与如何选择
| 技术 | 适用场景 | 推荐指数 |
|---|---|---|
| ASMX | 维护旧的 .NET Framework 项目;需要快速创建一个简单的 SOAP 服务。 | ⭐⭐ (已过时) |
| WCF | 需要构建一个企业级、支持多种协议(SOAP, REST, TCP 等)、安全性要求高的服务。 | ⭐⭐⭐ (复杂场景) |
| ASP.NET Web API | 新项目的首选,构建现代的 RESTful 服务,用于 Web 前后端分离、移动应用、单页应用的后端。 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| gRPC | 微服务架构,对性能、低延迟有极高要求的内部服务通信。 | ⭐⭐⭐⭐ (新兴技术) |
最终建议:
- 如果你是初学者:从 ASMX 开始,可以快速理解 WebService 的基本原理。
- 如果你在维护旧项目:你可能需要继续使用 ASMX 或 WCF。
- 如果你要开始一个新项目:毫不犹豫地选择 ASP.NET Web API,它是目前 .NET 生态中构建 HTTP 服务的标准,简单、高效、社区活跃,如果你使用的是 .NET Core 或 .NET 5/6/7/8,Web API 已经是内置且更强大的版本。
- 如果你在做微服务:并且对性能吹毛求疵,那么可以学习并考虑使用 gRPC。
