现在的位置: 首页 > 综合 > 正文

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

2018年01月22日 ⁄ 综合 ⁄ 共 9126字 ⁄ 字号 评论关闭

http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/4ed44acc-859c-4c9b-bdfa-34142497e1d7

  • 2009年7月27日 0:27

    NineTyNine_LiPei 的头像

    920 Points

     

    您好,我写的WCF程序在运行一段时间后,时常报出以下错误:

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

    当我把IIS网站关闭重启后,错误就消除了。

    请问这是怎么回事啊?


    做最好的自己

答案

  • 2009年7月27日 1:08

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复
    Hi,LiPei
      这个错误好像以前有人遇到过。
      如果客户端代理建立以后,长时间不使用,就会出现出错状态,进而无法使用。
      你在客户端调用代理的时候做一个判断,如果通道出错,进行重新连接,。或者重新new一个客户端代理。以前的销毁掉。
    试验一下


    Frank.Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    老徐的博客:http://frank_xl.cnblogs.com
  • 2009年7月27日 15:58

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复

    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
  • 2009年9月10日 16:07

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复

    xu lei,
    你好,
    我的程序最近又开始报这个错误。这个错误在我使用IE直接浏览时才会出现,当我用VS调试运行时就不会出现这个问题。
    我的使用代理的代码是这样写的,请你帮我看看吧。
            public static List<ArticleCatalogInfo> GetArticleCatalogInfos()
            {
                using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())
                {
                    if (!enableCaching)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }
                        return ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                    }

                    string cacheKey = "ArticleCatalog_GetArticleCatalogInfos";

                    List<ArticleCatalogInfo> ACInfoList = (List<ArticleCatalogInfo>)HttpRuntime.Cache[cacheKey];
                    if (ACInfoList == null)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }

                        ACInfoList = ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                        AggregateCacheDependency acd = DependencyFacade.GetArticleCatalogDependency();
                        AddToCache(cacheKey, ACInfoList, acd);
                    }
                    return ACInfoList;
                }
            }


    做最好的自己


    Hi,
       不要使用静态static的方法,这样连接会再加载类库的时候就实例化了,长时间肯定通道出错.~


    Frank Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog 
    欢迎访问微软WCF中文技术论坛:Welcome to
    Microsoft Chinese WCF Forum
     
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft
    English WCF Forum

全部回复

  • 2009年7月27日 1:08

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复
    Hi,LiPei
      这个错误好像以前有人遇到过。
      如果客户端代理建立以后,长时间不使用,就会出现出错状态,进而无法使用。
      你在客户端调用代理的时候做一个判断,如果通道出错,进行重新连接,。或者重新new一个客户端代理。以前的销毁掉。
    试验一下


    Frank.Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    老徐的博客:http://frank_xl.cnblogs.com
  • 2009年7月27日 15:58

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复

    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
  • 2009年7月28日 4:49

    NineTyNine_LiPei 的头像

    920 Points

     
    你好,Xu Lei,
    你说对了,就是因为闲置时间过长需要new一下。你在这方面得造诣不浅啊。总是能帮我们解决问题。
    祝你早日成为WCF的Professional,呵呵,应该说现在你已经可以称为Professional了。


    做最好的自己
  • 2009年7月28日 9:12

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     

    你好,Xu Lei,
    你说对了,就是因为闲置时间过长需要new一下。你在这方面得造诣不浅啊。总是能帮我们解决问题。
    祝你早日成为WCF的Professional,呵呵,应该说现在你已经可以称为Professional了。


    做最好的自己

    晕~
       希望能与大家多交流。每个人技术都有专注点,一起讨论问题进步的快~ 呵呵。
       我个人也是学习,如果能给大家提供帮助的话,自己也会非常开心。呵呵。


    Frank.Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    老徐的博客:http://frank_xl.cnblogs.com
  • 2009年8月6日 2:46

    Lv Jian 的头像
    Ufinity

    0 Points

     
    我也遇到了这样的问题,问题的起因是我在WCF的Service里抛出了一个Exception的异常。我尝试了Frank
    Xu Lei
    兄的方法,发现可以,
    但重新new了一个ServiceProxy以后,发现以前保存在Session里的数据丢失,
    比如我先Call一个名为Login的方法,然后再Call名为Fun方法,Fun的方法里需要验证,而Login以后用户名和密码会保存在Session中,这样就可以重复的Call Fun,而无需每次都登录。
    可是采用了重新New一个ServiceProxy的方法去解决LZ说的问题时,发现Session丢了。请教一下有没有好的解决方案。
  • 2009年8月6日 10:14

    郭厚昌 的头像

    0 Points

     
    Xu Lei,您好。我也遇到过这样的问题。按照您说的方法解决了这个问题。

    还有个问题就是关于WCF安全认证的资料哪里有

    谢谢

  • 2009年8月6日 10:27

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     
    Hi ,
      google是最好的办法~
    呵呵,网上很多,不过我也整理的安全相关的概念,包括资料连接。
    WCF分布式开发步步为赢(14):WCF安全编程--基本概念  
    基本涉及到WCF安全所有的知识点了。你看看可以对你有帮助没~

    参考资料:
    1.programming WCF Services
    2.http://msdn.microsoft.com/en-us/library/ms735093.aspx3.WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发
    4.WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509
    证书的获得和管理 

    5.http://msdn.microsoft.com/zh-cn/library/ms731069.aspx
    6.http://technet.microsoft.com/zh-cn/library/cc768063(en-us).aspx
    7.http://www.microsoft.com/msj/0899/kerberos/kerberos.aspx



    Frank Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog 
    欢迎访问微软WCF中文技术论坛:Welcome to
    Microsoft Chinese WCF Forum
     
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft
    English WCF Forum
  • 2009年9月10日 15:32

    NineTyNine_LiPei 的头像

    920 Points

     

    xu lei,
    你好,
    我的程序最近又开始报这个错误。这个错误在我使用IE直接浏览时才会出现,当我用VS调试运行时就不会出现这个问题。
    我的使用代理的代码是这样写的,请你帮我看看吧。
            public static List<ArticleCatalogInfo> GetArticleCatalogInfos()
            {
                using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())
                {
                    if (!enableCaching)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }
                        return ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                    }

                    string cacheKey = "ArticleCatalog_GetArticleCatalogInfos";

                    List<ArticleCatalogInfo> ACInfoList = (List<ArticleCatalogInfo>)HttpRuntime.Cache[cacheKey];
                    if (ACInfoList == null)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }

                        ACInfoList = ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                        AggregateCacheDependency acd = DependencyFacade.GetArticleCatalogDependency();
                        AddToCache(cacheKey, ACInfoList, acd);
                    }
                    return ACInfoList;
                }
            }


    做最好的自己
  • 2009年9月10日 16:07

    Frank Xu Lei 的头像
    SOA
    (MVP)

    13,980 Points

     已答复

    xu lei,
    你好,
    我的程序最近又开始报这个错误。这个错误在我使用IE直接浏览时才会出现,当我用VS调试运行时就不会出现这个问题。
    我的使用代理的代码是这样写的,请你帮我看看吧。
            public static List<ArticleCatalogInfo> GetArticleCatalogInfos()
            {
                using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())
                {
                    if (!enableCaching)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }
                        return ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                    }

                    string cacheKey = "ArticleCatalog_GetArticleCatalogInfos";

                    List<ArticleCatalogInfo> ACInfoList = (List<ArticleCatalogInfo>)HttpRuntime.Cache[cacheKey];
                    if (ACInfoList == null)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }

                        ACInfoList = ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                        AggregateCacheDependency acd = DependencyFacade.GetArticleCatalogDependency();
                        AddToCache(cacheKey, ACInfoList, acd);
                    }
                    return ACInfoList;
                }
            }


    做最好的自己


    Hi,
       不要使用静态static的方法,这样连接会再加载类库的时候就实例化了,长时间肯定通道出错.~


    Frank Xu Lei--谦卑若愚,好学若饥 
    专注于.NET平台下分布式应用系统开发和企业应用系统集成 
    Focus on Distributed Applications Development and EAI based on .NET 
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog 
    欢迎访问微软WCF中文技术论坛:Welcome to
    Microsoft Chinese WCF Forum
     
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft
    English WCF Forum
  • 2009年9月11日 1:58

    NineTyNine_LiPei 的头像

    920 Points

     
    呵呵,谢谢!没注意到这个!


    做最好的自己

抱歉!评论已关闭.