[料理佳餚] 使用 dotnet-svcutil 手動從 WSDL 檔案產生代理類別並整合進 .NET Core 專案

以往我們要呼叫 ASMX Web Service 的服務,大多透過 Visual Studio 的「加入 -> 服務參考」的程序,自動產生 Reference.cs 程式碼檔案,裡面就有我們要用的服務代理。但現在因為開發環境無法連線 Web Service,所以無法使用這個方式,我們手上有的是一個 *.wsdl 檔案,要改用手動的方式建立服務代理。

安裝 dotnet-svcutil

執行下列指令,安裝 dotnet-svcutil

dotnet tool install --global dotnet-svcutil

產生 Reference.cs 檔案

使用 dotnet-svcutil 產生 Reference.cs 檔案,也就是我們要的服務代理。

dotnet-svcutil .\WebService1.wsdl --namespace "*,WebServiceClientLab.MyWebService" --outputDir "MyWebService" --sync

指令使用到的參數說明如下:

  • --namespace:用來指定 WSDL 或 XML 裡面的 targetNamespace(目標命名空間)要對應到 .NET 的命名空間。你可以指定一個或多個對應關係,如果有些 targetNamespace 沒有特別指定對應,請用 '*' 表示通用的對應規則。如果不特別設定,它會自動根據 WSDL 裡的 targetNamespace 來產生對應的 .NET 命名空間。簡單來說,就是讓你控制產生出來的 C# 類別,放在哪個命名空間裡。
  • --outputDir:用來指定產生的檔案要放在哪個資料夾。如果沒特別指定,預設會放在目前資料夾底下,名稱叫做 ServiceReference。簡單來說,就是指定產生的檔案要放在哪個資料夾。
  • --sync:用來讓工具除了產生非同步方法外,也同時產生同步版本的方法。

然後,我們把產生出來的資料夾,整個搬進我們的專案裡面,我額外建立了一個 Service References 資料夾來存放它。

加入 System.ServiceModel.Http 套件

此時,我們的專案應該還無法建置,因為還缺少 System.ServiceModel.Http 套件,把它加入之後,應該就能順利建置了。

測試呼叫的程式碼如下:

using WebServiceClientLab.MyWebService;

var client = new WebService1SoapClient(WebService1SoapClient.EndpointConfiguration.WebService1Soap);

// 同步版本
var helloWorld = client.HelloWorld();

// 非同步版本
var helloWorldResponse =await client.HelloWorldAsync();

Console.WriteLine($"Sync: {helloWorld}");
Console.WriteLine($"Async: {helloWorldResponse.Body.HelloWorldResult}");
Console.ReadLine();

測試結果:

以上,就是如何在無法直接透過 Visual Studio 加入服務參考的情況下,改用 dotnet-svcutil 工具手動從 .wsdl 檔案產生服務代理程式碼的流程。完成這些設定之後,我們就能像以往一樣透過熟悉的方式來呼叫服務,無論是同步還是非同步方法,都能順利整合進應用程式中。如果剛好有遇到類似問題的朋友,希望本篇文章對你有幫助。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學