ASP.NET WebService 教程

目录

  1. 第一部分:什么是 WebService?
    • 1 核心概念
    • 2 为什么使用 WebService?
    • 3 WebService 的核心标准(SOAP, WSDL)
  2. 第二部分:开发环境准备
    • 1 软件安装
    • 2 创建第一个 ASP.NET WebService 项目
  3. 第三部分:动手实践 - 创建一个简单的 WebService
    • 1 添加 WebService 方法
    • 2 理解 ServiceContract 和OperationContract (WCF 模式)
    • 3 理解 ASMX 模式(传统方式)
  4. 第四部分:测试和调用 WebService
    • 1 使用内置测试页面
    • 2 使用 C# 客户端调用
    • 3 使用 JavaScript (jQuery AJAX) 调用
  5. 第五部分:进阶主题
    • 1 传递复杂数据(对象/类)
    • 2 传递和接收数据集
    • 3 异步方法
  6. 第六部分:重要注意事项与最佳实践
    • 1 ASMX vs. WCF vs. Web API
    • 2 安全性考虑
  7. 第七部分:总结

第一部分:什么是 WebService?

1 核心概念

WebService 是一种跨编程语言、跨操作系统的远程通信技术,它允许不同的应用程序通过网络(通常是 HTTP/HTTPS)相互交换数据或调用对方的功能。

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

你可以把它想象成一个“网络上的函数库”,你的应用程序(客户端)可以像调用本地函数一样,去调用部署在另一台服务器上的“函数”(WebService 方法)。

2 为什么使用 WebService?

  • 系统集成:将不同技术栈构建的系统(如 Java 应用、PHP 网站、.NET 桌面应用)集成在一起。
  • 代码复用:将通用的业务逻辑(如用户验证、数据计算、天气查询)封装成 WebService,供多个应用调用,避免重复开发。
  • 跨平台通信:基于开放标准,任何能发送 HTTP 请求并解析 XML 的平台都可以消费你的 WebService。

3 WebService 的核心标准

  • SOAP (Simple Object Access Protocol)

    • WebService 的“语言”或“消息格式”,它是一种基于 XML 的协议,用于在 Web 上交换结构化信息。
    • SOAP 消息包含三个部分:Envelope(必需,包装整个消息)、Header(可选,包含元数据)、Body(必需,包含实际的应用数据)。
    • 即使 SOAP 名字里有 "Simple",但它非常标准和健壮,支持事务、安全等复杂特性。
  • WSDL (Web Services Description Language)

    • WebService 的“说明书”或“接口文档”,它是一个 XML 文件,描述了 WebService 的所有信息:
      • 可用哪些方法(操作)。
      • 每个方法的参数(输入)和返回值(输出)是什么类型。
      • 如何访问这个 WebService(URL、协议等)。
    • 客户端可以通过解析 WSDL 文件,自动生成调用 WebService 所需的代理类,无需关心底层实现细节。

第二部分:开发环境准备

1 软件安装

你需要安装 Visual Studio,推荐使用较新的版本,如 Visual Studio 2025,但它也完全支持创建和运行旧的 ASMX 项目。

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

2 创建第一个 ASP.NET WebService 项目

在现代 Visual Studio 中,创建传统 ASMX WebService 的选项可能被隐藏,请按以下步骤操作:

  1. 打开 Visual Studio,选择“创建新项目”。
  2. 在搜索框中输入 ASP.NET Web 应用程序,然后选择它,点击“下一步”。
  3. 为你的项目命名,MyFirstWebService,然后点击“创建”。
  4. 在弹出的“创建新 ASP.NET Web 应用程序”窗口中,选择“空”模板
  5. 在“附加信息”部分,将框架选择为 .NET Framework(.NET Framework 4.8),不要选 .NET 5/6/7/8。
  6. 点击“创建”。

你已经有了一个空的 ASP.NET Web 项目。


第三部分:动手实践 - 创建一个简单的 WebService

1 添加 WebService 方法

  1. 在“解决方案资源管理器”中,右键点击你的项目名称,选择“添加” -> “新建项”。
  2. 在“添加新项”窗口中,选择“Web 服务 (ASMX)”。
  3. 将文件名命名为 Service1.asmx,然后点击“添加”。

Visual Studio 会为你创建一个 Service1.asmx 文件和一个对应的 Service1.asmx.cs 代码隐藏文件。

  1. 打开 Service1.asmx.cs 文件,你会看到默认的代码:
using System;
using System.Web.Services; // 引入命名空间
namespace MyFirstWebService
{
    /// <summary>
    /// Service1 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")] // WebService 的命名空间
    [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
    {
        public Service1 ()
        {
            //如果使用设计的组件,请取消注释以下行
            //InitializeComponent(); 
        }
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

代码解释:

asp webservice教程
(图片来源网络,侵删)
  • [WebService(...)]: 这是一个特性,用于标记这个类是一个 WebService。Namespace 属性是这个服务的唯一标识符,默认是 http://tempuri.org,在实际项目中应该修改为更有意义的 URI,http://yourcompany.com/webservices/
  • [WebMethod]: 这是最重要的特性,它将一个公共方法暴露为 WebService 的一个可调用的操作,只有标记了 [WebMethod] 的方法才能被远程客户端访问。

让我们添加我们自己的方法,在 HelloWorld 方法下面添加:

[WebMethod]
public string AddTwoNumbers(int a, int b)
{
    return $"The sum of {a} and {b} is: {a + b}";
}

2 理解 ASMX 模式(传统方式)

上面的代码就是最传统的 ASMX 方式,它直接继承自 System.Web.Services.WebService,并使用 [WebMethod] 特性,这是 .NET Framework 早期提供的 WebService 技术。

3 理解 ServiceContract 和 OperationContract (WCF 模式)

虽然我们的目标是 ASMX,但了解更现代的 WCF (Windows Communication Foundation) 模式也很有帮助,因为概念相似。

WCF 不使用 [WebMethod],而是使用:

  • [ServiceContract]: 标记一个接口或类作为服务的契约。
  • [OperationContract]: 标记接口中的方法作为服务的一个操作。

WCF 示例 (仅作对比):

using System.ServiceModel; // WCF 命名空间
[ServiceContract(Namespace = "http://mycompany.com/webservices")]
public IMyWcfService
{
    [OperationContract]
    string AddTwoNumbers(int a, int b);
}
// 实现类
public class MyWcfService : IMyWcfService
{
    public string AddTwoNumbers(int a, int b)
    {
        return $"The sum of {a} and {b} is: {a + b}";
    }
}

对于初学者和快速集成,ASMX 仍然非常简单有效。


第四部分:测试和调用 WebService

1 使用内置测试页面

这是 ASMX 最方便的特性之一。

  1. F5 或点击 Visual Studio 工具栏上的“播放”按钮来运行你的项目。

  2. 浏览器会自动打开一个页面,显示你的 WebService 的可用方法列表。

  3. 点击 AddTwoNumbers 链接。

  4. 你会看到一个测试页面,有两个输入框 ab,输入一些数字,1020

  5. 点击“调用”按钮。

  6. 页面下方会显示一个 XML 格式的响应,这正是 SOAP 请求和响应的简化视图。

<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">The sum of 10 and 20 is: 30</string>

这证明了你的 WebService 已经成功创建并可以运行!

2 使用 C# 客户端调用

我们创建一个控制台应用程序来调用这个 WebService。

  1. 在同一个解决方案中,右键点击“解决方案”,选择“添加” -> “新建项目”。
  2. 选择“控制台应用 (.NET Framework)”,命名为 WebServiceClient
  3. 在“解决方案资源管理器”中,右键点击 WebServiceClient 项目,选择“添加” -> “服务引用”。
  4. 在弹出的窗口中,点击“高级”。
  5. 在“高级”窗口中,点击“添加 Web 引用”。
  6. 在 URL 框中,粘贴你的 WebService 的地址(通常是 http://localhost:xxxx/Service1.asmx),然后点击“前往”。
  7. 成功后,Web 引用名称会显示出来(默认是 localhost),你可以修改它,例如改为 MyWebServiceRef,然后点击“添加引用”。
  8. 打开 Program.cs,编写调用代码:
using System;
namespace WebServiceClient
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建 WebService 代理类的实例
            MyWebServiceRef.Service1SoapClient client = new MyWebServiceRef.Service1SoapClient();
            // 2. 像调用本地方法一样调用远程方法
            string result = client.AddTwoNumbers(100, 250);
            // 3. 显示结果
            Console.WriteLine("调用结果: " + result);
            Console.ReadKey();
        }
    }
}

运行这个控制台应用程序,你会在控制台看到输出:调用结果: The sum of 100 and 250 is: 350

3 使用 JavaScript (jQuery AJAX) 调用

在现代 Web 应用中,通过 JavaScript 调用 WebService 非常常见。

  1. 回到你的 MyFirstWebService Web 项目。
  2. 在项目中添加一个 HTML 页面,Default.html
  3. 在 HTML 中添加一些输入控件和按钮,并引入 jQuery 库。
<!DOCTYPE html>
<html>
<head>调用 ASMX WebService</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h2>使用 jQuery 调用 WebService</h2>
    <input type="number" id="num1" placeholder="输入第一个数" />
    <input type="number" id="num2" placeholder="输入第二个数" />
    <button id="addButton">相加</button>
    <h3>结果:</h3>
    <p id="result"></p>
    <script>
        $(document).ready(function () {
            $("#addButton").click(function () {
                var a = parseInt($("#num1").val());
                var b = parseInt($("#num2").val());
                // 重要:需要启用 [ScriptService] 特性
                // 在 Service1.asmx.cs 中取消注释这行: [System.Web.Script.Services.ScriptService]
                $.ajax({
                    type: "POST",
                    url: "Service1.asmx/AddTwoNumbers",
                    data: "{'a': " + a + ", 'b': " + b + "}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response) {
                        // response.d 是 ASP.NET AJAX 的约定
                        $("#result").text(response.d);
                    },
                    error: function (xhr, status, error) {
                        $("#result").text("发生错误: " + error);
                    }
                });
            });
        });
    </script>
</body>
</html>

关键点:

  • 你必须在 Service1.asmx.cs 文件中取消注释 [System.Web.Script.Services.ScriptService] 特性,否则 AJAX 调用会失败。
  • url 是相对于当前页面的 WebService 方法路径。
  • data 参数必须是 JSON 格式的字符串。
  • success 回调函数中的 response.d 是 ASP.NET AJAX 的一个约定,d 属性包含了实际返回的数据。

第五部分:进阶主题

1 传递复杂数据(对象/类)

WebService 可以轻松地在客户端和服务器之间传递自定义对象。

  1. 在你的 WebService 项目中创建一个 C# 类,User.cs
public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

在你的 WebService 中添加一个使用该类的方法:

[WebMethod]
public string GetUserInfo(User user)
{
    return $"用户名: {user.Name}, 年龄: {user.Age}";
}

客户端(无论是 C# 还是 JavaScript)会自动序列化和反序列化这个 User 对象。

2 传递和接收数据集

对于需要返回多行数据的场景,DataSetDataTable 是一个经典的选择。

using System.Data;
using System.Data.SqlClient;
[WebMethod]
public DataSet GetProductList()
{
    string connectionString = "你的数据库连接字符串";
    string query = "SELECT ProductID, ProductName FROM Products";
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                DataSet ds = new DataSet();
                sda.Fill(ds, "Products");
                return ds;
            }
        }
    }
}

客户端会收到一个包含 Products 表的 XML 格式 DataSet

3 异步方法

为了避免在处理耗时操作时阻塞 Web 请求,可以使用异步方法。

[WebMethod]
public async Task<string> GetLongRunningDataAsync()
{
    // 模拟一个耗时操作
    await Task.Delay(5000); // 等待5秒
    return "这是长时间操作的结果";
}

注意:异步 WebMethod 需要客户端也支持异步调用。


第六部分:重要注意事项与最佳实践

1 ASMX vs. WCF vs. Web API

特性 ASMX WCF Web API
技术 早期技术,基于 SOAP 和 HTTP 统一框架,支持多种协议 (HTTP, TCP, MSMQ 等) 基于 RESTful 架构,使用 HTTP
消息格式 主要是 SOAP SOAP, JSON, Plain Text 等 主要是 JSON, XML
风格 面向操作 面向服务和操作 面向资源
适用场景 维护旧系统;需要简单快速的 SOAP 服务。 企业级应用,需要复杂通信协议和安全特性。 构建现代、轻量级的 Web API 和移动后端服务。
推荐度 不推荐用于新项目 功能强大但配置复杂,新项目较少使用 目前构建 Web API 的首选

对于全新的项目,如果需要构建服务,优先考虑 ASP.NET Core Web API,如果你需要维护或扩展现有的 ASMX 服务,本教程的知识仍然非常有用。

2 安全性考虑

  • 认证和授权:默认情况下,ASMX WebService 是开放的,你需要使用 Windows 身份验证、Forms 身份验证或自定义机制来保护它们。
  • 输入验证:永远不要信任来自客户端的数据,对所有输入参数进行严格的验证,防止 SQL 注入、跨站脚本等攻击。
  • HTTPS:在生产环境中,始终使用 HTTPS 来加密通信内容,防止数据被窃听。

第七部分:总结

本教程带你走完了 ASP.NET WebService (ASMX) 的完整开发流程:

  1. 理解了 WebService 的基本概念和核心标准 (SOAP, WSDL)
  2. 学会了在 Visual Studio 中创建和配置 ASMX 项目
  3. 掌握了如何使用 [WebMethod] 特性暴露方法
  4. 学会了使用内置页面、C# 客户端和 jQuery AJAX 三种方式来调用和测试 WebService
  5. 了解了传递复杂数据、异步方法等进阶用法
  6. 明确了 ASMX 在现代开发中的定位和安全性注意事项

虽然 ASMX 已不再是构建新服务的首选技术,但它在许多遗留系统中仍然扮演着重要角色,掌握它不仅能帮助你维护现有代码,也能让你更好地理解 Web 服务通信的基本原理。