现象:

最近遇到了WCF 服务无法调用的错误,异常如下。

System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Error while reading message framing format at position 0 of stream (state: ReadingUpgradeRecord)

System.IO.InvalidDataException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 More data was expected, but EOF was reached.

日志

WCF的问题一般需要对框架比较熟悉,有时难以定位。第一眼找不到原因的先 根据官方文档打开WCF日志

日志打开后发现服务端完全没有调用的记录。这时怀疑是不是调错端口了,打开资源管理器,服务正常跑着。只能再打开Wireshark记录日志,大概就是正常的3次握手,不正常的不知为何服务端主动FIN并RESET的连接。

在WCF的问题处理中,自己的日志/WCF的日志/抓包的日志都很重要。

原因

最后的原因发现是端口被罗技升级程序占用的问题, 考虑如下示例代码

// 设置要监听的端口号
int port = 13000;
TcpListener listener = new TcpListener(IPAddress.Any, port);
TcpListener listener2 = new TcpListener(IPAddress.Loopback, port);
// 开始监听
listener.Start();
listener2.Start();
// 并不会抛出异常
Console.ReadLine();

工作久了过于相信经验,感觉一定会异常,但端口监听的是套接字,自然0.0.0.0:13000 和 127.0.0.1:13000不是一回事。

WCF异常原理

wcf的通信流程大概是这样的。

// 客户端发送服务端基地址,确认这是一个wcf的服务
client-> service: net.tcp://127.0.0.1:39100/Service // 服务端回0b 代表确认
service-> client: 0x0b // 客户端发送具体调用的内容
.....

由于服务端不回 0x0b,自然会出现这样的异常。附一下异常的调用栈。事后看看也挺明显。

System.ServiceModel.Channels.ConnectionUpgradeHelper.ValidatePreambleResponse(Byte[] buffer, Int32 count, ClientFramingDecoder decoder, Uri via)
System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper)
System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection connection, TimeoutHelper& timeoutHelper)
System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)
System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
...

WCF异常System.ServiceModel.ProtocolException问题处理的更多相关文章

  1. WCF部署到IIS异常(详细: 不能加载类型System.ServiceModel.Activation.HttpModule )

    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...

  2. 【WinForm】“System.Data.SqlClient.SqlConnection”的类型初始值设定项引发异常,无法识别的配置节 system.serviceModel

    出现问题的原因: 在本机上没有出现问题,让一个同事测试的时候,在另外一台电脑上出现连接数据库失败,系统不能打开的问题 在网上搜了一下,有说是数据库连接字符串错误的,有说app.config文件配置不匹 ...

  3. 【使用WCF,发布服务端浏览报错】未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” 中加载类型 “System.ServiceModel.Activation.HttpModule”。

    问题: 在WIN7中的IIS服务器中部署WCF服务程序时,通过浏览器访问报出如下错误: 未能从程序集"System.ServiceModel, Version=3.0.0.0, Cultur ...

  4. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  5. jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding

    Jquery ajax调用WCF服务 例子效果如下:原界面 点击按钮GetList get后,通过指定的Url获取数据添加到table 新建一个控制台项目,添加IContract.cs,DBServi ...

  6. jquery ajax调用WCF,采用System.ServiceModel.WSHttpBinding协议

    采用System.ServiceModel.WSHttpBinding或者basicHttpBinding 协议.客户端就不能直接在前端通过url直接访问服务了 它是基于SOAP协议的bing,会采用 ...

  7. WCF项目问题1-找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

    找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHosti ...

  8. System.ServiceModel.CommunicationException: 接收HTTP 响应时错误发生

    具体错误信息例如以下: System.ServiceModel.CommunicationException: 接收对 http://110.110.110.110/TestService/TestS ...

  9. 通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。

    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态. 在 System.ServiceModel.Channels. ...

  10. 未能加载文件或程序集“System.ServiceModel, Version=2.0.5.0, ...”解决方法

    未能加载文件或程序集“System.ServiceModel, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它 ...

随机推荐

  1. Html简要笔记

    html在线文档: https://www.w3school.com.cn 怎么创建文件我已经会了 1,html快速入门 <!--文档类型说明 注释 --> <!DOCTYPE ht ...

  2. 微软在Microsoft Build 2024 上 发布了.NET 9 预览版4

    在 Microsoft Build 2024 上,与往年一样,.NET 不是会议主题演讲的主题,但是微软在这个大会上为.NET 推出一组新的功能和工具,旨在使 .NET 开发更快.更轻松,具体内容可以 ...

  3. SQL 分析与优化神器,验证了真相定律

    引言 今天要分享的是一个 SQL 语句分析的神器,它是一个基于 Soar 的开源 sql 分析与优化的 Web 图形化工具.我们在平常分析 SQL 语句,使用最多的方式就是 Explain 工具.了解 ...

  4. WPF+Emgucv实现在图像上画出感兴趣的区域 并进行掩膜获取 得到图像均值 和简单的 漫水填充

    <Grid.RowDefinitions></Grid.RowDefinitions> <Grid> <UniformGrid Columns="2 ...

  5. docker 监控数据整合

    安装docker #开启内核转发 echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf sysctl -p wget -O /etc/yum.repo ...

  6. 7.20考试总结(NOIP模拟21)[Median·Game·Park]

    雨滴降落的速度是每秒十米,我该用怎么样的速度,才能将你挽留? 前言 关于语文素养如何限制OI水平2,正好现在文化课巨佬们正在考语文(那我走???) T1 我以为整数是不用输出 .0 的,然后喜挂 30 ...

  7. 如何使用Node.js、TypeScript和Express实现RESTful API服务

    Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Express是一个保持最小规模的灵 ...

  8. ftp和tftp有什么区别

    TFTP和FTP都是文件传输协议,但它们在很多方面存在明显的区别. 安全性:FTP协议使用的是明文传输,而TFTP协议使用的是UDP协议,没有使用TCP,所以不提供验证. 传输方式:FTP协议使用的是 ...

  9. 简单实现Viper配置管理

    本文由 ChatMoney团队出品 简介 前面实现的一个简易suno-api.是使用cookie来获取suno-token发起请求的.当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了 ...

  10. CSP-S2019 题解

    做了这套题,如果是让现在的我当时去考的话应该一共可以有 450 分,格雷码,括号树,树的重心都可以做,树上的数可以有 10 分,Emiya 至少可以有 76 分, 划分也可以有 64 分.看 OIer ...