记一次.net core调用SOAP接口遇到的问题
背景
最近需要将一些外部的Web Service
及其他SOAP
接口的调用移到一个独立的WebAPI
项目中,然后供其他.Net Core
项目调用。之前的几个Web Service
已经成功迁移,但是在迁移一个需要用户名密码认证的SOAP
接口的时候却始终调用不成功。下面直接上代码。
示例代码
在.net framework
中通过添加服务引用会自动在web.config
(或者app.config
)中生成类似以下绑定配置:
<system.serviceModel>
<bindings>
<customBinding>
<binding name="binding">
<mtomMessageEncoding ="Soap11WSAddressing10" />
<httpTransport authenticationScheme="Basic"/>
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://sampl.url" binding="customBinding" bindingConfiguration="binding" contract="TestClient" name="binding" />
</client>
</system.serviceModel>
可以直接调用client
的无参构造函数(会从配置中读取相应的配置)来获取客户端实例,但是由于.net core
中已经不支持web.config
(或者app.config
),因此需要自己通过代码来创建binding
和EndpointAddress
来获取客户端实例
var binding = new CustomBinding(new HttpTransportBindingElement
{
AuthenticationScheme = AuthenticationSchemes.Basic
});
var client = new TestClient(binding, new EndpointAddress(new Uri("http://sample.url")));
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "123456";
var response = client.Add(new Request()).Result
发现问题
在测试过程中始终抛异常The server returned an invalid or unrecognized response.
。使用上面相同的代码在.net framework
里测试却能正常获取响应,初步判断应该是.net core
中的问题。通过wireshark工具抓包比对,我发现了差别。
请求正常的抓包截图
请求失败的抓包截图
通过两个请求的比对发现,失败的请求头部信息中没有Authorization
信息。接着我使用HttpClient
发送post
请求来模拟对SOAP
接口的调用。
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "YWRtaW46MTIzNDU2==");
在设置和不设置Authorization
的分别测试中发现设置了Authorization
能够成功请求并获得响应,不设置Authorization
的请求获得了一段html
格式的文本响应,其中有一段很说明问题HTTP 401 - Unauthorized
。在这两个不同的请求抓包中也发现成功的请求头部中是包含Authorization
信息的,另一个则没有。因此基本断定问题就出现在这里。
如何解决
问题找到了,是因为请求头部中缺少Authorization
信息,但是如何解决我却始终没有找到好的办法,SOAP
接口的调用不像使用HttpClient
发送post
请求可以对header
进行修改。直接使用HttpClient
发送post
请求来调用SOAP
接口对XML
的序列化和反序列化又很是麻烦,也不想使用这种过于牵强的做法。翻遍了博客园和stackoverfolw
也始终没有找到解决办法。
终于,在我不懈的努力中看到了曙光,在github
上翻dotnet/wcf
的Issues
的时候找到一些相关东西,特别是这一条https://github.com/dotnet/wcf/issues/3008。其中提到System.Private.ServiceModel
版本高于或等于4.5.0的时候会抛异常The server returned an invalid or unrecognized response.
,虽然他的使用跟我的不太一样,但是异常信息却相同。我当即将版本降到4.4.4再次测试,结果令人惊喜,请求成功了,通过抓包分析Authorization
信息在请求头部中。这证实我之前的判断,就是因为没有Authorization
信息导致请求失败。
结语
问题解决了,System.Private.ServiceModel
4.5.0及以上版本会存在此问题,降级到4.4.4方可解决,希望微软早日修复此问题,在NuGet包管理中看到有更新但又不能更新的包是一件很不爽的事情!
记一次.net core调用SOAP接口遇到的问题的更多相关文章
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- dotnet Core 调用HTTP接口,系统大量CLOSE_WAIT连接问题的分析,尚未解决。
环境: dotnet core 1.0.1 CentOS 7.2 今天在服务器巡检的时候,发现一个服务大量抛出异常 异常信息为: LockStatusPushError&&Messag ...
- 使用WebService发布soap接口,并实现客户端的https验证
什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...
- PHP调用内容DES加密的SOAP接口
本文以方倍工作室优惠券接口开发为例,介绍PHP下DES加解密及SOAP接口调用的实现过程. 一.基础概念 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加 ...
- .net Core 调用微信Jsapi接口,H5解析二维码
项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...
- 关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题
关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题,有需要的朋友可以参考下. php调用java写的soap接口经验: 场景一: java是以数组的形式接收参数的 ...
- Angular调用Asp.net Core JWT Authentication接口
基本思路是调用登录接口,获取token,使用token请求其他JWT接口: getHomeDetails(): Observable<HomeDetails> { let headers ...
- 翻译-使用Spring调用SOAP Web Service
原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP ...
- Saiku调用WS接口(十四)
Saiku调用WS接口 关于saiku集成系统单点登录告一段落,始终没想好怎么去做,主要是因为saiku有自己的权限定义,一直没想好关于saiku本身的权限信息以及用户信息怎么处理(在这里笔者希望已实 ...
随机推荐
- FZU 2036 Log Calculator
思路:数学题! 给定a,b,求s=log2(2a+2b);转化为s=b+log2(2a-b+1),(a>b). 测试可以知道,当x>=32时,在精度范围内log2(2x+1)=x.否则将a ...
- [转]MySQL创建用户与授权方法
注:我的运行环境是widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY ...
- 使用BusyBox制作linux根文件系统(CramFS+mdev)
转:http://www.360doc.com/content/10/0428/11/496343_25245348.shtml 操作系统:Ubuntu9.04 内核版本:linux-2.6.24.7 ...
- 在Oracle中利用SQL_TRACE跟踪SQL的执行
当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢? Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被 输出到trace文 ...
- 配置安全证书的Etcd集群
不知在哪篇技术文档中看到,kubernetes master和etcd分开部署模式,因为集群的状态都保存在etcd中,这样当kubernetes master挂掉后,通过API Server交互的Sc ...
- Bootstrap导航栏实例讲解
导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏是响应式元组件就,作为应用程序或网站的导航标题.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开. ...
- Ceph源码解析:CRUSH算法
1.简介 随着大规模分布式存储系统(PB级的数据和成百上千台存储设备)的出现.这些系统必须平衡的分布数据和负载(提高资源利用率),最大化系统的性能,并要处理系统的扩展和硬件失效.ceph设计了CRUS ...
- 判断客户端是PC还是手持设备的JS代码【转】
1.第一种: 复制代码代码如下: function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = [&quo ...
- iOS:手势的详解UIGestureReconizer
手势类:UIGestureReconizer 父类: 手势状态枚举 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { UIGesture ...
- Kali 2.0安装与使用指南
阅读目录 (1)如果坚持用系统自带浏览器,其汉化方法: (2)如果有强迫症删了系统自带浏览器,然后重新安装了一个新的火狐可能遇到的问题: (3)如果你有火狐账号,你登陆了发现书签和插件没有同步? (4 ...