WCF 通信对象XX无法用于通信,因为其处于“出错”状态


转自:http://blog.sina.cn/dpool/blog/s/blog_94a5fb4501016pzt.html?vt=4

通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
Hi,LiPei
这个错误好像以前有人遇到过。
如果客户端代理建立以后,长时间不使用,就会出现出错状态,进而无法使用。
你在客户端调用代理的时候做一个判断,如果通道出错,进行重新连接,。或者重新new一个客户端代理。以前的销毁掉。
试验一下 Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客:http://frank_xl.cnblogs.com
在补充一下:
我在做WCf安全编程的时候,发现也会有这个错误:The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.
原因是我用户名和密码错误,安全验证没有通过,所以直接通到状态为出错,不可用。直接调用服务操作会出错。
你在客户端调用前,使用wcfServiceProxy.State来判断一下,是否为Faulted状态,然后在处理。
这个通道错误,目前来说知道的比较常见的原因就是一个是超时,一个安全验证失败。
其它原因也许会导致这个错误。继续关注吧~
Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客:http://frank_xl.cnblogs.com
xu lei,
你好,
我的程序最近又开始报这个错误。这个错误在我使用IE直接浏览时才会出现,当我用VS调试运行时就不会出现这个问题。
我的使用代理的代码是这样写的,请你帮我看看吧。
public static List GetArticleCatalogInfos()
{
using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())
{
if (!enableCaching)
{
if (ACSProxy.State != CommunicationState.Opened)
{
ACSProxy.Open();
}
return ACSProxy.GetArticleCatalogInfos().ToList();
}
string cacheKey = 'ArticleCatalog_GetArticleCatalogInfos';
List ACInfoList = (List)HttpRuntime.Cache[cacheKey];
if (ACInfoList == null)
{
if (ACSProxy.State != CommunicationState.Opened)
{
ACSProxy.Open();
}
ACInfoList = ACSProxy.GetArticleCatalogInfos().ToList();
AggregateCacheDependency acd = DependencyFacade.GetArticleCatalogDependency();
AddToCache(cacheKey, ACInfoList, acd);
}
return ACInfoList;
}
}
做最好的自己
Hi,
不要使用静态static的方法,这样连接会再加载类库的时候就实例化了,长时间肯定通道出错.~
--------------------------------------------------------------------------------------------
日记:
说明:
①启动任务时出现了URL不合理的错误提示。
②启动时就会出现在serviceModel中找不到协定错误提示。
③从另一方收到未进行安全处理或安全处理不正确的错误。有关错误代码和详细信息,请参阅内部 FaultException。(无法处理消息,因为操作“http://tempuri.org/IMessageService/GetCustInfo”无效或无法识别。)
④在获取很大数据时会出现传输内容要小于配置参数大小,设置MaxReceiveMessageSize和MaxbufferPoolSize属性为:int.MaxValue大小.r /> ⑤在手工创建服务对象时出现③错误提示,如果把绑定类型改成BasicHttpBinding后会出现客户端与服务器不匹配的错误提示。出现这种提示的原因有可能是多种。请见后面说明。
①服务地址必须要加上http://规范的IP地址,因为客户端绑定服务时会配置服务协议
有多种请见参考。
②服务对象不能在定义成员变量中进行对象实例化。因为在实例化对象时无法找到这个服务对象的地址,这个对象的地址是后台代码绑定,并不是通过配置文件参数来访问服务地址的。
③这种现象与⑤这种情况都属于客户端与服务器端两端建立的参数不一样才会出现这种类似错误提示。此项目是如果是手工创建服务对象时,注意:客户端的配置文件记录的属性参数是无效的,此服务与编写代码中的终端地址相关联,如果只是在客户端更新服务是不够的,还是将服务发布到手工编写中的地址,如果没有发布,保是更改代码绑定类型,在调用这个服务对象方法时会出现客户端与服务器不匹配的错误提示。
这跟真实需求中对传输的性能、质量、事务、安全以及异构的情况有关。
WCF服务编程中有一些介绍。一点理解请参考:
BasicHttpBinding 采用Http/Https协议,Text/MTOM编码,主要用于与旧的ASMX Web服务协作,但无法传递事务且无法使用WS*协议的优势。
NetTcpBinding 采用Tcp协议, 二进制编码,支持事务、安全且性能较好。
WSHttpBinding 采用Http/Https协议,Text/MTOM编码,但可以传递事务。
还有其它绑定,如对等网、双工等,可以参考一些书籍和资料。
这个错误的原因,在异常信息里有部分信息:可能绑定不匹配导致的错误。
①客户端和服务器安全模式不同,例如客户端启用安全,而服务器没有启用安全;
②客户端和服务器编码模式不同,导致无法匹配错误信息。
③客户端和服务端SOAP版本不同。也可能导致问题。
④客户端和服务端事务设置不同等等。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM