.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

相关文章
相关标签/搜索