dotnet core 3.0 调用soap websevice

今天因为项目需要,客户那边提供的soap 1.1的webservice,而我们用dotnet core 3.0调用的时候费了不少精力,所以写笔记记录一下吧。
首先我们需要确定soap的版本,上面已经写到了我们客户提供的是soap 1.1,下面具体代码中会提到。

正式开始

  • 添加服务引用,直接上图


    添加服务引用

    选择Microsoft WCF Web Service Reference Provider
  • 因为客户提供的是wsdl文件,所以点击浏览找到那个wsdl文件,一路下一步,点完成,因为他连不到对方服务器,所以会慢一点,等一会就好


    点击浏览

    选择wsdl文件

    点击下一步直到完成
  • 开始修改代码,我们已经可以看到vs帮我们自动生成了Reference.cs文件,打开它,找到GetEndpoinstAddress并修改里面的IP地址和端口(这个是否需要改,要看你是否能够直接连到对方服务器,因为有的是需要走vpn或者其他映射才能连上对方服务器)


    修改soap的ip和端口
  • 找到IsOneWay把它改成false


    IsOneWay改成false
  • 找到GetDefaultEndpoinstAddress()把private修改为public,因为一会我们要用到它


    修改GetDefaultEndpoinstAddress
  • 这个时候打开你项目的csproj文件,红框中标记出来的几个包默认版本比较老vs在编译的时候会报错,按照要求直接改吧


    修改引用包的版本
  • 接下来直接上代码了

            //注意两个element的顺序,弄反了会报错的
            var binding = new CustomBinding(new TextMessageEncodingBindingElement
            {
                //我们调用的soap是1.1,这里要选用Soap11,否则默认是1.2,会报错
                MessageVersion = MessageVersion.Soap11
            },new HttpTransportBindingElement
            {
                //认证模式
                AuthenticationScheme = AuthenticationSchemes.Basic
            });

            TestService.model _model = new TestService.model ();
            TestService.service _client = 
                new TestService.service(binding, 
                TestService.service.GetDefaultEndpointAddress());//这里就是刚才我们为什么要修改private为public的原因
            _client .ClientCredentials.UserName.UserName = "user";//账号
            _client .ClientCredentials.UserName.Password = "pass";//密码            
            _model .name= "user001";
            _model .sex= "人妖";
            _model .age= 10;
            
            await _client .SaveUserAsync(_model);

至此,所有工作就全部完成了,去对方系统里看看吧,数据已经发过去了。

你可能感兴趣的:(dotnet core 3.0 调用soap websevice)