.NET Core 如何調用 WebService

0.使用背景

由於如今的項目都是基於 .NET Core 的,可是某些須要調用第三方的 WebService 服務,故有了此文章。其基本思路是經過微軟提供的 Svcutil 工具生成代理類,而後經過 System.ServiceModel 來調用代理類所提供的對象與方法。web

1.配置準備

1.1 新建並編輯項目

首先新建一個新的 .NET Core 控制檯程序,經過命令行窗口或者 Powershell 執行如下命令新建一個項目。shell

dotnet new console

而後編輯項目文件 WebServiceConsole.csproj ,並在其中加入如下內容:express

<ItemGroup>
    <DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*" />
</ItemGroup>

這樣最終 WebServiceConsole.csproj 的內容會是這樣子的。app

<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 來執行代理類生成操做。async

dotnet svcutil [WebService 地址]ide

上面是命令格式,好比說我這裏有一個 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

成功以後會看到文件夾裏面多了一個文件夾。ui

注意,在生成代理類以後,咱們還須要再執行一次 dotnet restore 來還原代理類當中所使用到的 NuGet 包。spa

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

相關文章
相關標籤/搜索