记一次.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.ServiceModel4.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本身的权限信息以及用户信息怎么处理(在这里笔者希望已实 ...
随机推荐
- Problem B: 查找某一个数
#include<stdio.h> int main(void) { ]; int i; char ch='n'; while(scanf("%d %d",&x ...
- iOS 系统原生分享图片 文字 音乐 纯视频 网页
为了方便使用,我封装了一个分享的工具类LFSystemShareUtil.工程要引Social.framework. LFSystemShareUtil.h #import <Foundatio ...
- 使用eclipse远程调试weblogic
配置weblogic远程调试之前,需要做这几个工作: 1) 安装weblogic服务器,然后创建一个域: 2) 安装eclipse集成IDE: 3) eclipse中包含发布 ...
- 性能问题: SQL*Net message from client 等待时间太长
今天我终于自己遇到了这个问题, PO form 打不开了, 看了下 trace 发现 SQL*Net message from client 等待时间太长. 但是这不可能是网络问题, 这个环境是在我电 ...
- [Java基础] Java对象内存结构
转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的 ...
- 一、Instrument之Core Animation工具
一.Instrument 三个方法: (1).按下Command + I打开Instrument; (2).Xcode->product->profile; (3).Xcode->O ...
- iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
菜单控制器和菜单项:弹出自定义的菜单栏窗口 提示: 1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES2. Menu所处的View必须 ...
- C#.net开发 List与DataTable相互转换 【转】
http://blog.csdn.net/shuizhaoshui/article/details/51425527 在.NET开发中,操作关系型数据库提取数据经常用到DataTable.ASP.NE ...
- 30分钟LINQ教程【转】
千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看完它!!! 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之 ...
- KL变换和PCA的数学推导
一些推导的笔记 上面分解成无穷维,大多数时候都不是的吧... 这里的d有限维,应该是指相对小于上面的分解的维度的某个数 参考资料 参考资料,上面是从最小化损失的角度,利用拉格朗日对偶的优化方法求解 p ...