您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Asp.NET Core怎么調(diào)用WebService的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
0.使用背景
因?yàn)楝F(xiàn)在的項(xiàng)目都是基于 .NET Core 的,但是某些需要調(diào)用第三方的 WebService 服務(wù),故有了此文章。其基本思路是通過(guò)微軟提供的 Svcutil 工具生成代理類(lèi),然后通過(guò) System.ServiceModel 來(lái)調(diào)用代理類(lèi)所提供的對(duì)象與方法。
1.配置準(zhǔn)備
1.1 新建并編輯項(xiàng)目
首先新建一個(gè)新的 .NET Core 控制臺(tái)程序,通過(guò)命令行窗口或者 Powershell 執(zhí)行以下命令新建一個(gè)項(xiàng)目。
dotnet new console
然后編輯項(xiàng)目文件 WebServiceConsole.csproj ,并在其中加入以下內(nèi)容:
<ItemGroup> <DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*" /> </ItemGroup>
這樣最終 WebServiceConsole.csproj 的內(nèi)容會(huì)是這樣子的。
<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ù)打開(kāi)命令行窗口或者 Powershell 執(zhí)行以下命令,還原項(xiàng)目文件的包。
dotnet restore
1.2 代理類(lèi)生成
現(xiàn)在準(zhǔn)備工作做好了,現(xiàn)在我們可以使用 dotnet svcutil
命令來(lái)生成代理類(lèi),或者你可以到 WindowsSDKs 的目錄下找到 SvcUtil.exe 來(lái)執(zhí)行代理類(lèi)生成操作。
dotnet svcutil [WebService 地址]
上面是命令格式,比如說(shuō)我這里有一個(gè) WebService 提供的接口,其地址為 http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl ,那么我們需要打開(kāi)命令行工具,執(zhí)行以下命令來(lái)生成代理類(lèi)。
復(fù)制代碼 代碼如下:
dotnet svcutil http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl](http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl
成功之后會(huì)看到文件夾里面多了一個(gè)文件夾。
注意,在生成代理類(lèi)之后,我們還需要再執(zhí)行一次 dotnet restore
來(lái)還原代理類(lèi)當(dāng)中所使用到的 NuGet 包。
2.調(diào)用 WebService 接口
生成代理類(lèi)之后,重新打開(kāi)項(xiàng)目,可以看到多了一個(gè) ServiceModel1 的文件夾,在里面還有一個(gè) Reference.cs 的文件,這個(gè)文件里面的內(nèi)容就是根據(jù)我們之前提供的 Url 生成的代理類(lèi)了。
用法的話(huà)很簡(jiǎn)單,需要三步,在這里我直接在 Main()
方法內(nèi)部寫(xiě)調(diào)用方法了,注意這里基本上所有生成的方法都是異步方法。
using System; using System.ServiceModel; using System.Threading.Tasks; namespace WebServiceConsole { class Program { static async Task Main(string[] args) { // 創(chuàng)建 HTTP 綁定對(duì)象 var binding = new BasicHttpBinding(); // 根據(jù) WebService 的 URL 構(gòu)建終端點(diǎn)對(duì)象 var endpoint = new EndpointAddress(@" http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl](http://localhost:3000/bsp-oisp/ws/sfexpressService?wsdl"); // 創(chuàng)建調(diào)用接口的工廠(chǎng),注意這里泛型只能傳入接口 var factory = new ChannelFactory<IExpressService>(binding, endpoint); // 從工廠(chǎng)獲取具體的調(diào)用實(shí)例 var callClient = factory.CreateChannel(); // 調(diào)用具體的方法,這里是 sfexpressServiceAsync 方法。 var result = await callClient.sfexpressServiceAsync(new sfexpressService()); Console.ReadLine(); } } }
3.注意事項(xiàng)
報(bào)文長(zhǎng)度問(wèn)題,我在call 一個(gè)QAS service時(shí),因?yàn)閳?bào)文過(guò)長(zhǎng),出過(guò)錯(cuò)誤,所以報(bào)文長(zhǎng)度最好手動(dòng)設(shè)置一下,防止默認(rèn)長(zhǎng)度不夠(默認(rèn)長(zhǎng)度我測(cè)試是65536)。
binding.MaxReceivedMessageSize=2000000
https需要設(shè)置。代碼如下:
channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None, RevocationMode = X509RevocationMode.NoCheck };
在call某些特殊的Web Service時(shí),生成的代理類(lèi)model無(wú)法解析服務(wù)返回報(bào)文,這種情況我只在Call QAS時(shí)遇到,在這里就詳細(xì)描述下問(wèn)題,QAS是一個(gè)國(guó)外提供地址校驗(yàn)的服務(wù)提供商,我們用他們提供的一個(gè)軟件安裝后生成的Web Service服務(wù)在轉(zhuǎn)發(fā)到他們自己的服務(wù)上。所以在生成代理類(lèi)的時(shí)候,就出現(xiàn)生成代理類(lèi)里面的model無(wú)法解析他的返回報(bào)文,經(jīng)過(guò)查閱代理類(lèi)代碼,發(fā)現(xiàn)他在生成返回報(bào)文的model中,返回字段有些會(huì)加上一個(gè)特性標(biāo)記,而這些標(biāo)記是錯(cuò)誤的,所以只要去掉就行。
例:
[System.Xml.Serialization.XmlElementAttribute(Order=0)] public string Country { get; set; }
Update如下即可
public string Country { get; set; }
關(guān)于“Asp.NET Core怎么調(diào)用WebService的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。