0.使用背景 因為現在的項目都是基於 .NET Core 的,但是某些需要調用第三方的 WebService 服務,故有了此文章。其基本思路是通過微軟提供的 Svcutil 工具生成代理類,然後通過 System.ServiceModel 來調用代理類所提供的對象與方法。 1.配置準備 1.1 新建 ...
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