目录

  1. 第一部分:基础概念

    webservice net教程
    (图片来源网络,侵删)
    • 什么是 WebService?
    • WebService 的核心标准
    • WebService 的工作原理
    • WebService vs. REST API
  2. 第二部分:使用 .NET Framework (传统方式)

    • 创建一个简单的 ASMX WebService
    • 测试 WebService
    • 创建客户端并调用 WebService
  3. 第三部分:使用现代 .NET (Core / 5+) (推荐方式)

    • 为什么选择现代 .NET?
    • 创建一个基于 WCF 的 WebService (现代方式)
    • 创建一个基于 SOAP 的 Minimal API (高级)
    • 创建一个 RESTful Web API (替代方案,也是目前主流)
  4. 第四部分:进阶主题

    • 数据序列化 (XML vs. JSON)
    • 安全性考虑
    • 部署到 Azure

第一部分:基础概念

什么是 WebService?

WebService 是一种基于 Web 的、跨平台的、自描述的、模块化的应用程序,它可以通过 Web 使用标准的 HTTP 协议进行调用,你可以把它想象成一个“网络上的函数库”,其他应用程序(无论用什么语言编写)都可以通过网络来调用它的功能。

webservice net教程
(图片来源网络,侵删)

核心特点:

  • 跨平台/跨语言:只要能发送 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 的工作原理

  1. 发布:开发者创建一个WebService,并将其部署到 Web 服务器上。
  2. 发现:客户端通过访问一个特定的 URL(http://server/Service.asmx?wsdl)来获取 WSDL 文件。
  3. 代理:客户端工具(如 Visual Studio)根据 WSDL 文件生成一个“代理类”(Proxy Class),这个代理类在本地模拟了远程的WebService,使得调用它就像调用本地方法一样简单。
  4. 调用:客户端代码调用代理类的方法。
  5. 封装与传输:代理类将方法调用、参数等信息封装成一个符合 SOAP 标准的 XML 消息(SOAP 请求)。
  6. HTTP 传输:这个 SOAP 请求通过 HTTP 协议发送到 WebService 的 URL。
  7. 处理与响应:WebService 服务器接收请求,解析 SOAP 消息,执行相应的业务逻辑,然后将结果封装成另一个 SOAP 响应消息。
  8. 返回结果:SOAP 响应消息通过 HTTP 返回给客户端。
  9. 解析:客户端的代理类接收 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。

webservice net教程
(图片来源网络,侵删)

步骤 1:创建项目

  1. 打开 Visual Studio (VS 2025)。
  2. 选择 "创建新项目" (Create a new project)。
  3. 搜索并选择 "ASP.NET Web 应用程序" (.NET Framework)。
  4. 给项目命名,ClassicWebService
  5. 在下一个窗口中,选择 "Web 服务" 模板,这会自动为你创建一个 ASMX WebService 项目。

步骤 2:添加 WebService 方法

  1. Visual Studio 会自动创建一个 Service.asmx 文件和它的代码后缀 Service.asmx.cs
  2. 打开 Service.cs 文件。
  3. 默认会有一个 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

  1. 在解决方案资源管理器中,右键点击 Service.asmx 文件,选择 "在浏览器中查看" (View in Browser)。
  2. 浏览器会显示一个测试页面,这个页面是根据你的 WSDL 自动生成的。
  3. GetWelcomeMessage 方法下,输入一个名字("张三"),然后点击 "调用" (Invoke) 按钮。
  4. 页面下方会显示一个 XML 格式的响应,这就是 SOAP 响应的简化视图。
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">你好, 张三! 欢迎使用 .NET WebService,当前时间是: 2025/10/27 10:30:00</string>

步骤 4:创建客户端并调用

  1. 在同一个解决方案中,右键点击 "解决方案",选择 "添加" -> "新建项目"。
  2. 选择 "控制台应用" (.NET Framework),命名为 WebServiceClient
  3. WebServiceClient 项目中,右键点击 "引用" (References),选择 "添加服务引用" (Add Service Reference)。
  4. 在弹出的窗口中,点击 "发现" (Discover),Visual Studio 会自动找到当前解决方案中的 Service.asmx
  5. 点击 "确定",Visual Studio 会生成代理类和相关配置。
  6. 打开 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();
        }
    }
}
  1. 运行 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 服务库

  1. 创建一个新的项目,选择 "WCF 服务库" (.NET 6/7/8)。
  2. 项目会包含 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:测试和调用

  1. 运行项目,默认情况下,它可能不会自动打开浏览器,但服务已在 http://localhost:5001 上运行。
  2. 你可以使用 wcftestclient.exe (Windows SDK 自带工具) 来测试,在 "服务" 菜单下,添加服务引用,输入 http://localhost:5001/Service.svc?wsdl
  3. 客户端调用方式与 .NET Framework 类似,使用 Add Service ReferenceChannelFactory

方案 B:创建 RESTful Web API (现代主流)

对于绝大多数新项目,RESTful API 是更好的选择,它在现代 .NET 中是原生支持的,非常简单。

步骤 1:创建 Web API 项目

  1. 创建新项目,选择 "ASP.NET Core Web API"
  2. 项目模板会自动为你设置好一切。

步骤 2:创建 Controller

  1. Controllers 文件夹中,右键添加一个 "控制器" -> "API 控制器 - 空"。
  2. 命名为 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:测试和调用

  1. 运行项目。
  2. 浏览器会自动打开 Swagger UI 页面 (地址通常是 https://localhost:7xxx/swagger)。
  3. 在 Swagger UI 中,你可以看到 GET /api/values/welcome/{userName} 这个接口。
  4. 点击 "Try it out",输入 userName ("王五"),然后点击 "Execute"。
  5. 你会看到返回的 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 非常简单:

  1. Azure App Service:这是最常用的选项,它支持 ASP.NET Core、.NET Framework、WCF 和各种其他技术。
    • 在 Visual Studio 中右键点击项目 -> "发布"。
    • 选择 "Azure" -> "Azure App Service (Windows)",然后按照向导登录并创建/选择服务实例。
  2. Azure Functions:如果你的服务是基于事件驱动的、无状态的(处理一个 HTTP 请求后完成),Azure Functions 是一个更经济、更轻量级的选择。
  3. 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 的开发!