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

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

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

成功之后會看到文件夾里面多了一個文件夾。
注意,在生成代理類之后,我們還需要再執(zhí)行一次 dotnet restore 來還原代理類當(dāng)中所使用到的 NuGet 包。
2.調(diào)用 WebService 接口
生成代理類之后,重新打開項目,可以看到多了一個 ServiceModel1 的文件夾,在里面還有一個 Reference.cs 的文件,這個文件里面的內(nèi)容就是根據(jù)我們之前提供的 Url 生成的代理類了。
用法的話很簡單,需要三步,在這里我直接在 Main() 方法內(nèi)部寫調(diào)用方法了,注意這里基本上所有生成的方法都是異步方法。
using System;
using System.ServiceModel;
using System.Threading.Tasks;
namespace WebServiceConsole
{
class Program
{
static async Task Main(string[] args)
{
// 創(chuàng)建 HTTP 綁定對象
var binding = new BasicHttpBinding();
// 根據(jù) WebService 的 URL 構(gòu)建終端點對象
var endpoint = new EndpointAddress(@" http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl](http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl");
// 創(chuàng)建調(diào)用接口的工廠,注意這里泛型只能傳入接口
var factory = new ChannelFactory<IExpressService>(binding, endpoint);
// 從工廠獲取具體的調(diào)用實例
var callClient = factory.CreateChannel();
// 調(diào)用具體的方法,這里是 sfexpressServiceAsync 方法。
var result = await callClient.sfexpressServiceAsync(new sfexpressService());
Console.ReadLine();
}
}
}
3.注意事項
報文長度問題,我在call 一個QAS service時,因為報文過長,出過錯誤,所以報文長度最好手動設(shè)置一下,防止默認長度不夠(默認長度我測試是65536)。
binding.MaxReceivedMessageSize=2000000
https需要設(shè)置。代碼如下:
channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication =
new X509ServiceCertificateAuthentication()
{
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = X509RevocationMode.NoCheck
};
在call某些特殊的Web Service時,生成的代理類model無法解析服務(wù)返回報文,這種情況我只在Call QAS時遇到,在這里就詳細描述下問題,QAS是一個國外提供地址校驗的服務(wù)提供商,我們用他們提供的一個軟件安裝后生成的Web Service服務(wù)在轉(zhuǎn)發(fā)到他們自己的服務(wù)上。所以在生成代理類的時候,就出現(xiàn)生成代理類里面的model無法解析他的返回報文,經(jīng)過查閱代理類代碼,發(fā)現(xiàn)他在生成返回報文的model中,返回字段有些會加上一個特性標(biāo)記,而這些標(biāo)記是錯誤的,所以只要去掉就行。
例:
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public string Country { get; set; }
Update如下即可
public string Country { get; set; }
4.參考資料:
https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.net Core中實現(xiàn)自定義身份認證的示例代碼
這篇文章主要介紹了Asp.net Core中實現(xiàn)自定義身份認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
ASP.NET MVC5驗證系列之Remote Validation
這篇文章主要為大家詳細介紹了ASP.NET MVC5驗證系列之Remote Validation,感興趣的小伙伴們可以參考一下2016-07-07
asp.net 關(guān)于==?:和if()else()條件判斷等效例子
關(guān)于==?:和if()else() 等效例子2010-03-03
EntityFramework 6.x學(xué)習(xí)之多個上下文遷移實現(xiàn)分布式事務(wù)詳解
這篇文章主要給大家介紹了關(guān)于EntityFramework 6.x學(xué)習(xí)之多個上下文遷移實現(xiàn)分布式事務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案
這篇文章主要介紹了Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案,需要的朋友可以參考下2017-06-06
關(guān)于HttpHandler與HttpModule的理解和應(yīng)用方法
本篇文章小編將為大家介紹,關(guān)于HttpHandler與HttpModule的理解和應(yīng)用方法,有需要的朋友可以參考一下2013-04-04

