目录
-
第一部分:Web Service 基础知识
(图片来源网络,侵删)- 什么是 Web Service?
- 为什么使用 Web Service?
- 核心技术:SOAP vs. REST (重要区别)
- 本教程将重点讲解 ASMX Web Service (SOAP)
-
第二部分:创建你的第一个 C# WebService (ASMX)
- 准备工作:安装 Visual Studio
- 步骤 1:创建 WebService 项目
- 步骤 2:添加 WebService 方法
- 步骤 3:测试和发布你的 WebService
-
第三部分:调用 WebService (客户端)
- 使用“添加 Web 引用” (传统 .NET Framework)
- 使用“添加服务引用” (推荐,.NET Framework 3.5+)
- 使用 HttpClient 调用 RESTful API (现代方法)
-
第四部分:进阶与总结
- 现代 WebService 的替代品:WCF 和 Web API
- 总结与学习路径
第一部分:Web Service 基础知识
什么是 Web Service?
Web Service(网络服务)是一种基于 Web 的、跨平台的、跨语言的、自描述的、可编程的应用程序组件,它使用标准的 Web 协议(如 HTTP)和数据格式(如 XML, JSON)来进行通信。

你可以把它想象成一个在互联网上运行的服务,它暴露一些功能(方法),其他任何程序(无论用什么语言编写,运行在任何操作系统上)都可以通过标准的网络协议来调用这些功能。
为什么使用 Web Service?
- 跨平台和跨语言:Java 程序可以调用 C# 写的 Web Service,Python 程序也可以,它们之间通过标准协议通信,无需关心对方的内部实现。
- 重用性:可以将核心业务逻辑封装成 Web Service,供多个不同的应用程序(如网站、桌面App、移动App)共享使用,避免重复开发。
- 松耦合:客户端和服务端是独立的,你可以修改服务端的实现,而只要接口不变,客户端就不需要做任何改动。
核心技术:SOAP vs. REST
这是理解 Web Service 的关键。
| 特性 | SOAP (Simple Object Access Protocol) | REST (Representational State Transfer) |
|---|---|---|
| 协议 | 严格的协议,有自己的规范(如信封格式、错误处理)。 | 一种架构风格,没有严格的协议,更侧重于设计原则。 |
| 数据格式 | 默认且强制使用 XML。 | 灵活,常用 JSON,也支持 XML、纯文本等。 |
| 标准 | 标准化程度高,有 WS-Security 等标准。 | 没有官方标准,更简单、更灵活。 |
| 性能 | 由于 XML 格式冗长,通常性能较低。 | 由于 JSON 格式轻量,性能通常更高。 |
| 使用场景 | 企业级应用、金融、电信等需要高安全性、事务处理的场景。 | 移动应用、Web 前后端分离、公开 API(如微博、微信 API)。 |
本教程重点:我们将学习使用 ASMX 技术,这是 C# 中实现 SOAP Web Service 最经典、最简单的方式。
第二部分:创建你的第一个 C# WebService (ASMX)
准备工作
你需要安装 Visual Studio (Community 版本是免费的),确保在安装时勾选了 .NET 桌面开发 工作负载。
步骤 1:创建 WebService 项目
- 打开 Visual Studio。
- 选择 “创建新项目” (Create a new project)。
- 在搜索框中输入
ASP.NET Web 应用程序,然后选择模板,点击 “下一步”。 - 为你的项目命名,
MyFirstWebService,然后点击 “创建”。 - 在下一个窗口中,选择 “空” 模板,并确保勾选了 “Web 服务” 复选框,这会自动为你配置好所需的核心文件,点击 “创建”。
步骤 2:添加 WebService 方法
-
在 “解决方案资源管理器” 中,你会看到一个名为
Service.asmx的文件,这默认就是你的 WebService 文件。 -
双击打开
Service.asmx.cs文件(.cs 是代码文件)。 -
你会看到一个默认的
Service类,它继承自System.Web.Services.WebService。 -
在
Service类中,添加一个公共方法,为了符合 WebService 的规范,我们需要在方法上加上[WebMethod]特性。using System.Web.Services; namespace MyFirstWebService { /// <summary> /// Service 的摘要说明 /// </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 Service : System.Web.Services.WebService { public Service() { } [WebMethod] public string HelloWorld() { return "Hello World"; } // 添加我们自己的方法 [WebMethod] public string GetServerTime() { return $"当前服务器时间是: {System.DateTime.Now}"; } [WebMethod] public int Add(int a, int b) { return a + b; } } }[WebService(Namespace = "...")]:指定了 WebService 的命名空间。http://tempuri.org是一个临时命名空间,在实际项目中应该使用你自己的唯一命名空间,http://yourcompany.com/webservices。[WebMethod]:这是最重要的特性,它告诉 .NET 框架,这个公共方法可以被客户端通过网络调用。
步骤 3:测试和发布你的 WebService
-
在 Visual Studio 中,直接按
F5键运行项目。 -
你的默认浏览器会自动打开一个页面,URL 可能是
http://localhost:xxxx/Service.asmx。 -
你会看到一个服务描述页面,列出了所有你标记了
[WebMethod]的方法(HelloWorld,GetServerTime,Add)。 -
点击其中一个方法的链接,
Add,你会看到该方法的详细描述,包括参数和返回值的格式(XML)。 -
在页面的最下方,有一个“测试”区域,你可以在这里输入参数,点击“调用”按钮来直接测试你的 WebService。
-
点击“调用”后,浏览器会显示一个 XML 格式的响应结果,这正是 SOAP 协议的标准响应格式。
恭喜!你已经成功创建并测试了一个 WebService!
第三部分:调用 WebService (客户端)
现在我们创建一个新的控制台应用程序来调用刚刚发布的 WebService。
使用“添加服务引用” (推荐)
这是在 .NET Framework 项目中最常用、最强大的方法。
-
在同一个 Visual Studio 解决方案中,右键点击 “解决方案” -> “添加” -> “新建项目”。
-
选择 “控制台应用 (.NET Framework)”,命名为
WebServiceClient。 -
在 “解决方案资源管理器” 中,右键点击
WebServiceClient项目的 “引用” -> “添加服务引用...”。 -
在弹出的窗口中,点击 “高级” -> “添加 Web 引用...”。 (这一步是为了调用传统的 ASMX 服务,直接“添加服务引用”也可以,但配置略有不同)。
-
在 “URL” 输入框中,输入你正在运行的 WebService 的地址,
http://localhost:xxxx/Service.asmx(xxxx 是你实际的端口号)。 -
点击“前往”按钮,Visual Studio 会发现服务并列出它的方法。
-
将 Web 引用的 “Web 引用名” 改成一个更友好的名字,
MyWebService。 -
点击 “添加引用”。
-
打开
Program.cs文件,编写调用代码:using System; using MyWebService; // 这是你在添加引用时指定的命名空间 namespace WebServiceClient { class Program { static void Main(string[] args) { // 1. 创建 WebService 的代理对象 Service service = new Service(); // 2. 像调用本地方法一样调用远程的 WebService 方法 string timeResult = service.GetServerTime(); Console.WriteLine(timeResult); int sumResult = service.Add(10, 25); Console.WriteLine($"10 + 25 = {sumResult}"); Console.ReadKey(); } } } -
运行
WebServiceClient项目,你会看到从 WebService 返回的结果。
使用 HttpClient 调用 RESTful API (现代方法)
虽然 ASMX 是 SOAP,但理解如何用 HttpClient 调用 REST 服务(返回 JSON)非常重要,因为这是目前的主流。
注意:为了演示这个方法,我们需要稍微修改一下我们的 WebService,让它也能返回 JSON。
-
修改
Service.asmx.cs文件,给方法加上[ScriptMethod(ResponseFormat = ResponseFormat.Json)]特性,并引入System.Web.Script.Services命名空间。using System.Web.Services; using System.Web.Script.Services; // 引入这个命名空间 namespace MyFirstWebService { // ... (其他代码不变) public class Service : System.Web.Services.WebService { // ... [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] // 指定返回 JSON 格式 public int Add(int a, int b) { return a + b; } } } -
在
WebServiceClient项目中,你需要通过 NuGet 包管理器安装Newtonsoft.Json库(用于方便地解析 JSON)。- 右键点击项目 -> “管理 NuGet 程序包” -> 搜索
Newtonsoft.Json-> 安装。
- 右键点击项目 -> “管理 NuGet 程序包” -> 搜索
-
修改
Program.cs使用 HttpClient 调用:using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; // 使用 Newtonsoft.Json namespace WebServiceClient { class Program { // static HttpClient 是推荐的做法,可以复用连接 private static readonly HttpClient client = new HttpClient(); static async Task Main(string[] args) { // WebService 的 URL string serviceUrl = "http://localhost:xxxx/Service.asmx/Add"; // 构造请求参数 var parameters = new { a = 10, b = 25 }; // 将参数序列化为 JSON 字符串 string jsonPayload = JsonConvert.SerializeObject(parameters); // 创建 HTTP 请求内容 var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); try { // 发送 POST 请求 HttpResponseMessage response = await client.PostAsync(serviceUrl, content); // 确保请求成功 response.EnsureSuccessStatusCode(); // 读取响应内容 string responseBody = await response.Content.ReadAsStringAsync(); // 解析 JSON 响应 // 注意:ASMX 的 JSON 响应会包装在 "d" 对象中,{"d": 35} dynamic result = JsonConvert.DeserializeObject(responseBody); int sum = result.d; Console.WriteLine($"通过 HttpClient 调用,10 + 25 = {sum}"); } catch (HttpRequestException e) { Console.WriteLine($"请求出错: {e.Message}"); } Console.ReadKey(); } } }- 注意:ASMX 的 JSON 响应默认会包装在一个名为
d的属性中,所以解析时要用result.d来获取真实值,而纯 REST API 通常直接返回数据。
- 注意:ASMX 的 JSON 响应默认会包装在一个名为
第四部分:进阶与总结
现代 WebService 的替代品:WCF 和 Web API
ASMX 非常经典和简单,但对于现代应用,微软已经提供了更强大的技术:
-
WCF (Windows Communication Foundation):
- 一个功能极其强大的框架,可以创建多种类型的网络服务(包括 SOAP, REST, TCP, MSMQ 等)。
- 配置非常复杂,被称为“配置地狱”。
- 适用于企业内部复杂的、需要多种通信协议和高级安全特性的服务。
-
ASP.NET Web API:
- 目前创建 RESTful 服务的首选和标准。
- 它是专门为 HTTP 设计的,充分利用了 HTTP 协议的特性(GET, POST, PUT, DELETE 等)。
- 性能比 WCF 和 ASMX 更好,与 MVC 框架集成度高,开发体验更流畅。
- 如果你今天要新建一个 WebService,并且主要面向 Web 和移动客户端,请直接选择 Web API。
总结与学习路径
-
入门理解:从 ASMX 开始是最好的选择,它能让你快速理解 Web Service 的核心概念:服务、方法、XML/SOAP 通信、客户端代理,这是学习历史的基石。
-
现代开发:掌握 ASP.NET Web API,这是构建现代、高性能、RESTful 服务的行业标准,它的编程模型和 ASP.NET MVC 非常相似,容易上手。
-
企业级应用:了解 WCF,当你需要处理企业级需求,如安全、事务、多种传输协议时,WCF 仍然是一个强大的选项。
学习建议路径:
- 学 ASMX:理解 Web Service 的基本原理和 SOAP 协议。
- 学 Web API:掌握如何构建现代的 RESTful 服务,使用 JSON,并用 HttpClient 调用。
- 了解 WCF:知道它的存在和适用场景,在需要时再深入学习。
希望这份详细的教程能帮助你从零开始,系统地掌握 C# Web Service 的开发与调用!
