在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 代理类生成 现在准备工作做好了,现在我们可以使用
上面是命令格式,比如说我这里有一个 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
成功之后会看到文件夹里面多了一个文件夹。 注意,在生成代理类之后,我们还需要再执行一次 2.调用 WebService 接口 生成代理类之后,重新打开项目,可以看到多了一个 ServiceModel1 的文件夹,在里面还有一个 Reference.cs 的文件,这个文件里面的内容就是根据我们之前提供的 Url 生成的代理类了。 用法的话很简单,需要三步,在这里我直接在 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 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
请发表评论