0.使用背景
因為現在的項目都是基於 .NET Core 的,但是某些需要調用第三方的 WebService 服務,故有了此文章。其基本思路是通過微軟提供的 Svcutil 工具生成代理類,然后通過 System.ServiceModel 來調用代理類所提供的對象與方法。
1.配置准備
1.1 新建並編輯項目
首先新建一個新的 .NET Core 控制台程序,通過命令行窗口或者 Powershell 執行以下命令新建一個項目。
dotnet new console

然后編輯項目文件 WebServiceConsole.csproj ,並在其中加入以下內容:
<ItemGroup>
<DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*" />
</ItemGroup>
這樣最終 WebServiceConsole.csproj 的內容會是這樣子的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*" />
</ItemGroup>
</Project>
繼續打開命令行窗口或者 Powershell 執行以下命令,還原項目文件的包。
dotnet restore

1.2 代理類生成
現在准備工作做好了,現在我們可以使用 dotnet svcutil 命令來生成代理類,或者你可以到 WindowsSDKs 的目錄下找到 SvcUtil.exe 來執行代理類生成操作。
dotnet svcutil [WebService 地址]
上面是命令格式,比如說我這里有一個 WebService 提供的接口,其地址為 http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl ,那么我們需要打開命令行工具,執行以下命令來生成代理類。
dotnet svcutil http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl](http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl

成功之后會看到文件夾里面多了一個文件夾。
注意,在生成代理類之后,我們還需要再執行一次 dotnet restore 來還原代理類當中所使用到的 NuGet 包。
2.調用 WebService 接口
生成代理類之后,重新打開項目,可以看到多了一個 ServiceModel1 的文件夾,在里面還有一個 Reference.cs 的文件,這個文件里面的內容就是根據我們之前提供的 Url 生成的代理類了。
用法的話很簡單,需要三步,在這里我直接在 Main() 方法內部寫調用方法了,注意這里基本上所有生成的方法都是異步方法。
using System;
using System.ServiceModel;
using System.Threading.Tasks;
namespace WebServiceConsole
{
class Program
{
static async Task Main(string[] args)
{
// 創建 HTTP 綁定對象
var binding = new BasicHttpBinding();
// 根據 WebService 的 URL 構建終端點對象
var endpoint = new EndpointAddress(@" http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl](http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl");
// 創建調用接口的工廠,注意這里泛型只能傳入接口
var factory = new ChannelFactory<IExpressService>(binding, endpoint);
// 從工廠獲取具體的調用實例
var callClient = factory.CreateChannel();
// 調用具體的方法,這里是 sfexpressServiceAsync 方法。
var result = await callClient.sfexpressServiceAsync(new sfexpressService());
Console.ReadLine();
}
}
}
3.參考資料:
[1]https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide
[2]https://www.jianshu.com/p/aae85122f20f?tdsourcetag=s_pctim_aiomsg
