0.使用背景
因為現在的項目都是基于 .NET Core 的,但是某些需要調用第三方的 WebService 服務,故有了此文章。其基本思路是通過微軟提供的 Svcutil 工具生成代理類,然后通過 System.ServiceModel 來調用代理類所提供的對象與方法。
1.配置準備
1.1 新建并編輯項目
首先新建一個新的 .NET Core 控制臺程序,通過命令行窗口或者 Powershell 執行以下命令新建一個項目。
1
|
dotnet new console |
然后編輯項目文件 WebServiceConsole.csproj ,并在其中加入以下內容:
1
2
3
|
< ItemGroup > < DotNetCliToolReference Include = "dotnet-svcutil" Version = "1.0.*" /> </ ItemGroup > |
這樣最終 WebServiceConsole.csproj 的內容會是這樣子的。
1
2
3
4
5
6
7
8
9
10
11
|
< 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 執行以下命令,還原項目文件的包。
1
|
dotnet restore |
1.2 代理類生成
現在準備工作做好了,現在我們可以使用 dotnet svcutil
命令來生成代理類,或者你可以到 WindowsSDKs 的目錄下找到 SvcUtil.exe 來執行代理類生成操作。
dotnet svcutil [WebService 地址]
上面是命令格式,比如說我這里有一個 WebService 提供的接口,其地址為 http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl ,那么我們需要打開命令行工具,執行以下命令來生成代理類。
成功之后會看到文件夾里面多了一個文件夾。
注意,在生成代理類之后,我們還需要再執行一次 dotnet restore
來還原代理類當中所使用到的 NuGet 包。
2.調用 WebService 接口
生成代理類之后,重新打開項目,可以看到多了一個 ServiceModel1 的文件夾,在里面還有一個 Reference.cs 的文件,這個文件里面的內容就是根據我們之前提供的 Url 生成的代理類了。
用法的話很簡單,需要三步,在這里我直接在 Main()
方法內部寫調用方法了,注意這里基本上所有生成的方法都是異步方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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.注意事項
報文長度問題,我在call 一個QAS service時,因為報文過長,出過錯誤,所以報文長度最好手動設置一下,防止默認長度不夠(默認長度我測試是65536)。
1
|
binding.MaxReceivedMessageSize=2000000 |
https需要設置。代碼如下:
1
2
3
4
5
6
|
channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None, RevocationMode = X509RevocationMode.NoCheck }; |
在call某些特殊的Web Service時,生成的代理類model無法解析服務返回報文,這種情況我只在Call QAS時遇到,在這里就詳細描述下問題,QAS是一個國外提供地址校驗的服務提供商,我們用他們提供的一個軟件安裝后生成的Web Service服務在轉發到他們自己的服務上。所以在生成代理類的時候,就出現生成代理類里面的model無法解析他的返回報文,經過查閱代理類代碼,發現他在生成返回報文的model中,返回字段有些會加上一個特性標記,而這些標記是錯誤的,所以只要去掉就行。
例:
1
2
|
[System.Xml.Serialization.XmlElementAttribute(Order=0)] public string Country { get ; set ; } |
Update如下即可
1
|
public string Country { get ; set ; } |
4.參考資料:
https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.jianshu.com/p/aae85122f20f