杰瑞科技汇

WebService教程C如何入门?

C# WebService 教程

目录

  1. 第一部分:基础概念

    WebService教程C如何入门?-图1
    (图片来源网络,侵删)
    • 什么是 WebService?
    • WebService 的核心标准
    • C# 中实现 WebService 的几种方式
  2. 第二部分:使用 ASMX 创建和调用 WebService (入门经典)

    • 什么是 ASMX?
    • 实战:创建第一个 ASMX WebService
    • 实战:调用 ASMX WebService
    • ASMX 的优缺点
  3. 第三部分:使用 WCF 创建和调用 WebService (功能强大)

    • 什么是 WCF?
    • WCF 的核心概念 (ABC)
    • 实战:创建第一个 WCF 服务
    • 实战:调用 WCF 服务
    • WCF 的优缺点
  4. 第四部分:现代选择 - ASP.NET Web API

    • 为什么选择 Web API?
    • Web API 与 WebService 的区别
    • 实战:创建一个简单的 Web API
    • 实战:调用 Web API (使用 HttpClient)
  5. 第五部分:总结与如何选择

    WebService教程C如何入门?-图2
    (图片来源网络,侵删)

第一部分:基础概念

什么是 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,它们各有侧重和演进历程:

WebService教程C如何入门?-图3
(图片来源网络,侵删)
  1. ASMX (ASP.NET Web Services): 最早期、最简单的技术,直接基于 SOAP 和 HTTP,开发非常迅速,是入门级 WebService 的首选。
  2. WCF (Windows Communication Foundation): 功能极其强大的框架,它不仅仅支持 SOAP,还支持 REST、TCP、Named Pipes等多种协议和编码方式,它是一个“全能选手”,但配置相对复杂。
  3. ASP.NET Web API: 现代、轻量级的框架,专门用于构建基于 RESTful 风格的 HTTP 服务,它更符合现代 Web 开发的趋势,是构建移动端和前端应用后端服务的首选。
  4. 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 版本)

步骤:

  1. 创建项目:

    • 打开 Visual Studio,选择 "创建新项目"。
    • 搜索并选择 "ASP.NET Web 应用程序"
    • 给项目命名,AsmxWebServiceDemo
    • 在下一个窗口中,选择 "空" 模板,然后确保勾选了 "为 HTTPS 配置"
  2. 添加 WebService 服务:

    • 在 "解决方案资源管理器" 中,右键点击你的项目 -> 添加 -> 新建项...
    • 选择 "Web 服务",命名为 UserService.asmx
    • Visual Studio 会自动为你创建一个文件,其中包含默认的代码。
  3. 编写服务代码: 打开 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。
  1. 测试服务:
    • UserService.asmx 文件上右键,选择 “在浏览器中查看”
    • 你会看到一个服务说明页面,列出了你定义的两个 [WebMethod]
    • 点击 GetUserName,你会看到它生成了一个测试表单,输入 1,然后点击“调用”按钮。
    • 页面会返回一个标准的 SOAP 响应的 XML,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">张三</string>

恭喜!你的第一个 ASMX WebService 已经成功创建并运行了!

实战:调用 ASMX WebService

我们创建一个客户端来调用刚刚创建的服务。

  1. 添加客户端项目:

    • 在同一个解决方案中,右键点击“解决方案” -> 添加 -> 新建项目...
    • 选择 "控制台应用",命名为 AsmxWebServiceClient
  2. 添加 Web 引用:

    • AsmxWebServiceClient 项目中,右键点击“引用” -> 添加服务引用...
    • 在弹出的窗口中,点击 "高级..." 按钮。
    • 在弹出的新窗口中,点击 "添加 Web 引用..."
    • 在 URL 输入框中,粘贴你的 ASMX 服务的地址(http://localhost:XXXXX/UserService.asmx,XXXXX 是你的端口号)。
    • 点击“前往”,服务地址下方的下拉框会显示 UserService
    • 将 Web 引用别名设置为 UserServiceRef,然后点击“添加引用”。
  3. 编写调用代码: 打开 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 服务

步骤:

  1. 创建项目:

    • 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为 WcfServiceDemo
    • 选择 “空” 模板。
  2. 添加 WCF 服务:

    • 右键项目 -> 添加 -> 新建项...
    • 选择 "WCF 服务",命名为 IWCFUserService.cs (接口) 和 WCFUserService.svc.cs (实现)。
  3. 定义契约 (接口): 打开 IWCFUserService.cs,定义服务接口:

using System.ServiceModel;
namespace WcfServiceDemo
{
    // 告诉 WCF 框架这是一个服务契约
    [ServiceContract]
    public interface IWCFUserService
    {
        // 告诉 WCF 这是一个操作(方法)
        [OperationContract]
        string GetUserName(int userId);
    }
}
  1. 实现契约: 打开 WCFUserService.svc.cs,实现接口:
namespace WcfServiceDemo
{
    // 告诉 WCF 这个类实现了服务契约
    [ServiceBehavior]
    public class WCFUserService : IWCFUserService
    {
        public string GetUserName(int userId)
        {
            if (userId == 1) return "王五";
            return "未知用户";
        }
    }
}
  1. 配置绑定: 打开 Web.config 文件,在 <system.serviceModel> 节点下添加服务端点配置:
<system.serviceModel>
  <services>
    <service name="WcfServiceDemo.WCFUserService">
      <!-- 定义服务端点 -->
      <endpoint 
        address="" 
        binding="basicHttpBinding"  <!-- 使用 basicHttpBinding,类似于 ASMX -->
        contract="WcfServiceDemo.IWCFUserService" />
    </service>
  </services>
</system.serviceModel>
  1. 测试服务:
    • WCFUserService.svc 文件上右键,选择 “在浏览器中查看”
    • 页面会显示服务信息,并提供了 WSDL 的链接 (?wsdl),这证明服务已经可以访问。

实战:调用 WCF 服务

  1. 添加客户端项目:

    • 新建一个 "控制台应用" 项目,命名为 WcfServiceClient
  2. 添加服务引用:

    • 右键项目 -> 添加 -> 服务引用...
    • 点击 "发现",Visual Studio 会自动扫描当前解决方案中的 WCF 服务。
    • 选择你刚刚创建的 WCFUserService,命名空间设为 WcfServiceRef,点击“确定”。
  3. 编写调用代码: 打开 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

步骤:

  1. 创建项目:

    • 创建一个新的 "ASP.NET Web 应用程序" 项目,命名为 WebApiDemo
    • 在模板选择窗口,选择 "Web API",这个模板会自动帮你配置好所有东西。
  2. 添加模型:

    • 右键项目 -> 添加 -> 文件夹,命名为 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; }
    }
}
  1. 创建 API 控制器:

    • 右键 Controllers 文件夹 -> 添加 -> 控制器...
    • 选择 "Web API 2 控制器 - 空",命名为 ProductsController.cs
  2. 编写控制器代码: 打开 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/productsGet(id) 方法对应 api/products/{id}
  1. 测试 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)

  1. 创建客户端项目:

    • 新建一个 "控制台应用" 项目,命名为 WebApiClient
    • 右键项目 -> 管理 NuGet 程序包...,搜索并安装 Microsoft.AspNet.WebApi.Client 包(.NET Core/.NET 5+,则 System.Net.Http.Json 已内置)。
  2. 编写调用代码: 打开 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 的基本原理。
  • 如果你在维护旧项目:你可能需要继续使用 ASMXWCF
  • 如果你要开始一个新项目毫不犹豫地选择 ASP.NET Web API,它是目前 .NET 生态中构建 HTTP 服务的标准,简单、高效、社区活跃,如果你使用的是 .NET Core 或 .NET 5/6/7/8,Web API 已经是内置且更强大的版本。
  • 如果你在做微服务:并且对性能吹毛求疵,那么可以学习并考虑使用 gRPC
分享:
扫描分享到社交APP
上一篇
下一篇