首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET Web Service 入門:從創建到調用的完整實戰教程

     編輯:程式設計綜合問答

ASP.NET Web Service (ASMX) 是早期 .NET 實現 SOAP 服務的技術,雖已被 WCF/Web API/gRPC 取代,但維護舊系統時仍需掌握。本文演示創建簡單算術服務並由客戶端調用。

服務端創建

1. 新建 Web Service 文件

Visual Studio:右鍵專案 → Add → New Item → Web Service (ASMX) → 命名 Calculator.asmx

2. 實現業務邏輯


// Calculator.asmx.cs
using System.Web.Services;

[WebService(Namespace = "https://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Calculator : System.Web.Services.WebService
{
    [WebMethod(Description = "加法運算")]
    public double Add(double a, double b) => a + b;

    [WebMethod(Description = "減法運算")]
    public double Subtract(double a, double b) => a - b;

    [WebMethod(Description = "乘法運算")]
    public double Multiply(double a, double b) => a * b;

    [WebMethod(Description = "除法運算")]
    public double Divide(double a, double b) {
        if (b == 0) throw new ArgumentException("除數不能為零");
        return a / b;
    }
}

3. 運行測試

按 F5 運行,瀏覽器打開 https://localhost:port/Calculator.asmx,點擊方法名可測試調用,查看 SOAP 請求/回應格式。

客戶端調用

方式一:Web 引用 (傳統 ASMX 客戶端)


// 1. 右鍵 References → Add Service Reference → Advanced → Add Web Reference
// 2. 輸入服務 URL → 命名空間 CalculatorService
// 3. 調用代碼
using ClientApp.CalculatorService;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CalculatorSoapClient client = new CalculatorSoapClient();
        double result = client.Add(3, 4); // 同步調用
        TextBox1.Text = result.ToString(); // 顯示 7
    }
}

方式二:服務引用 (WCF 風格,推薦新專案)


// 添加服務引用 → 命名空間 CalculatorRef
using ClientApp.CalculatorRef;

public async Task CallAsync() {
    CalculatorSoapClient client = new CalculatorSoapClient(CalculatorSoapClient.EndpointConfiguration.BasicHttpBinding_ICalculatorSoap);
    double result = await client.AddAsync(10, 5); // 異步調用
    // 處理結果...
}

方式三:HttpClient 手動構造 SOAP (無依賴、跨平台)


public async Task CallAddAsync(double a, double b) {
    string soapEnvelope = $@"

  
    
      {a}
      {b}
    
  
";

    using (var client = new HttpClient()) {
        client.DefaultRequestHeaders.Add("SOAPAction", "\"https://tempuri.org/Add\"");
        var content = new StringContent(soapEnvelope, Encoding.UTF8, "text/xml");
        var response = await client.PostAsync("https://localhost:port/Calculator.asmx", content);
        string responseXml = await response.Content.ReadAsStringAsync();
        
        // 解析 XML 獲取結果 (可用 XmlDocument, XDocument, 或正則)
        XDocument doc = XDocument.Parse(responseXml);
        XNamespace ns = "https://tempuri.org/";
        return double.Parse(doc.Descendants(ns + "AddResult").First().Value);
    }
}

關鍵配置與避坑

問題解決
跨域調用失敗Web.config 添加 <httpProtocol><customHeaders><add name="Access-Control-Allow-Origin" value="*" /></customHeaders></httpProtocol>
最大接收訊息大小超限Web.config <binding maxReceivedMessageSize="2147483647">
序列化循環引用實體類標記 [DataContract(IsReference=true)]、屬性 [DataMember]
部署 IIS 驗證錯誤啟用匿名驗證、應用程序池 .NET CLR 版本正確

現代替代技術棧

  • ASP.NET Core Web API:RESTful、JSON、OpenAPI/Swagger、跨平台、高性能、原生 DI、現代標準。
  • gRPC:HTTP/2、Protobuf、強類型契約、流式傳輸、微服務首選。
  • GraphQL:按需查詢、單端點、強類型 Schema、前端友好。

遷移建議:新專案直接上 ASP.NET Core Web API;舊 ASMX 系統可逐步用 SoapCore 中間件在 Core 上承載,或建立 API Gateway 轉發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved