Asp.NET Core 如何调用WebService的方法

所属分类: 网络编程 / ASP.NET 阅读数: 1632
收藏 0 赞 0 分享

0.使用背景

因为现在的项目都是基于 .NET Core 的,但是某些需要调用第三方的 WebService 服务,故有了此文章。其基本思路是通过微软提供的 Svcutil 工具生成代理类,然后通过 System.ServiceModel 来调用代理类所提供的对象与方法。

1.配置准备

1.1 新建并编辑项目

首先新建一个新的 .NET Core 控制台程序,通过命令行窗口或者 Powershell 执行以下命令新建一个项目。

dotnet new console

然后编辑项目文件 WebServiceConsole.csproj ,并在其中加入以下内容:

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

这样最终 WebServiceConsole.csproj 的内容会是这样子的。

<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 来执行代理类生成操作。

dotnet svcutil [WebService 地址]

上面是命令格式,比如说我这里有一个 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

成功之后会看到文件夹里面多了一个文件夹。

注意,在生成代理类之后,我们还需要再执行一次 dotnet restore 来还原代理类当中所使用到的 NuGet 包。

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.注意事项

报文长度问题,我在call 一个QAS service时,因为报文过长,出过错误,所以报文长度最好手动设置一下,防止默认长度不够(默认长度我测试是65536)。

binding.MaxReceivedMessageSize=2000000

https需要设置。代码如下:

channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication =
new X509ServiceCertificateAuthentication()
{
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = X509RevocationMode.NoCheck
};

在call某些特殊的Web Service时,生成的代理类model无法解析服务返回报文,这种情况我只在Call QAS时遇到,在这里就详细描述下问题,QAS是一个国外提供地址校验的服务提供商,我们用他们提供的一个软件安装后生成的Web Service服务在转发到他们自己的服务上。所以在生成代理类的时候,就出现生成代理类里面的model无法解析他的返回报文,经过查阅代理类代码,发现他在生成返回报文的model中,返回字段有些会加上一个特性标记,而这些标记是错误的,所以只要去掉就行。
例:

[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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

.NET Core源码解析配置文件及依赖注入

这篇文章我们设计了一些复杂的概念,因为要对ASP.NET Core的启动及运行原理、配置文件的加载过程进行分析,依赖注入,控制反转等概念的讲解等
收藏 0 赞 0 分享

.NET Corek中Git的常用命令及实战演练

这篇文章将通过故事的形式从Git的历史谈起,并讲述Git的强大之处。然后通过实战演练教你如何在Github以及码云上托管我们的代码并进行代码的版本控制
收藏 0 赞 0 分享

Asp.Net Core WebAPI使用Swagger时API隐藏和分组详解

这篇文章主要给大家介绍了关于Asp.Net Core WebAPI使用Swagger时API隐藏和分组的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Asp.Net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

如何利用FluentMigrator实现数据库迁移

这篇文章主要给大家介绍了关于如何利用FluentMigrator实现数据库迁移的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

ASP.NET Core利用Jaeger实现分布式追踪详解

这篇文章主要给大家介绍了关于ASP.NET Core利用Jaeger实现分布式追踪的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

浅谈从ASP.NET Core2.2到3.0你可能会遇到这些问题

这篇文章主要介绍了ASP.NET Core2.2到3.0可能会遇到的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解.net core webapi 前后端开发分离后的配置和部署

这篇文章主要介绍了.net core webapi 前后端开发分离后的配置和部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁

这篇文章主要介绍了ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

.net 4.5部署到docker容器的完整步骤

这篇文章主要给大家介绍了关于.net 4.5部署到docker容器的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用.net4.5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

.net core并发下线程安全问题详解

这篇文章主要给大家介绍了关于.net core并发下线程安全问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多