http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/4ed44acc-859c-4c9b-bdfa-34142497e1d7
-
您好,我写的WCF程序在运行一段时间后,时常报出以下错误:
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
当我把IIS网站关闭重启后,错误就消除了。
请问这是怎么回事啊?
做最好的自己- 已移动 肖小勇Moderator 2009年7月27日 0:54 (发件人:ASP.NET 与 AJAX)
答案
-
Hi,LiPei
这个错误好像以前有人遇到过。
如果客户端代理建立以后,长时间不使用,就会出现出错状态,进而无法使用。
你在客户端调用代理的时候做一个判断,如果通道出错,进行重新连接,。或者重新new一个客户端代理。以前的销毁掉。
试验一下
Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客: http://frank_xl.cnblogs.com- 已标记为答案 NineTyNine_LiPei 2009年7月28日 4:50
-
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- 已标记为答案 NineTyNine_LiPei 2009年7月28日 4:51
-
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- 已标记为答案 NineTyNine_LiPei 2009年9月11日 1:58
全部回复
-
Hi,LiPei
这个错误好像以前有人遇到过。
如果客户端代理建立以后,长时间不使用,就会出现出错状态,进而无法使用。
你在客户端调用代理的时候做一个判断,如果通道出错,进行重新连接,。或者重新new一个客户端代理。以前的销毁掉。
试验一下
Frank.Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
老徐的博客: http://frank_xl.cnblogs.com- 已标记为答案 NineTyNine_LiPei 2009年7月28日 4:50
-
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- 已标记为答案 NineTyNine_LiPei 2009年7月28日 4:51
-
你好,Xu Lei,
你说对了,就是因为闲置时间过长需要new一下。你在这方面得造诣不浅啊。总是能帮我们解决问题。
祝你早日成为WCF的Professional,呵呵,应该说现在你已经可以称为Professional了。
做最好的自己 -
你好,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 -
我也遇到了这样的问题,问题的起因是我在WCF的Service里抛出了一个Exception的异常。我尝试了 Frank Xu Lei兄的方法,发现可以,
但重新new了一个ServiceProxy以后,发现以前保存在Session里的数据丢失,
比如我先Call一个名为Login的方法,然后再Call名为Fun方法,Fun的方法里需要验证,而Login以后用户名和密码会保存在Session中,这样就可以重复的Call Fun,而无需每次都登录。
可是采用了重新New一个ServiceProxy的方法去解决LZ说的问题时,发现Session丢了。请教一下有没有好的解决方案。
-
Xu Lei,您好。我也遇到过这样的问题。按照您说的方法解决了这个问题。
还有个问题就是关于WCF安全认证的资料哪里有
谢谢 -
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 -
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;
}
}
做最好的自己 -
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- 已标记为答案 NineTyNine_LiPei 2009年9月11日 1:58
-
呵呵,谢谢!没注意到这个!
做最好的自己