解决方案:WCF客户端无法获取服务端抛出的异常详细信息

  解决方案:WCF客户端无法获取服务端抛出的异常详细信息

解决方案:WCF客户端无法获取服务端抛出的异常详细信息


WCF客户端无法获取服务端抛出的异常详细信息,当WCF服务端抛出异常时当前通信channel中止,客户端获取的是下面的信息:


贴图图片



跟踪代码该异常是System.ServiceModel.CommunicationObjectFaultedException类型,无法获取具体的错误信息,将导致用户不明白系统究竟出了什么问题。


通过跟踪代码,发现在DAL层能辨别异常信息,如下图:

贴图图片


但是传到客户端只能取到ServiceChannel通信错误的CommunicationObjectFaultedException异常。



原理分析


要解释具体的原因,还得从信道(Channel)的两种分类形式说起。在上面一篇文章中,我们就谈到过:WCF通过信道栈实现了消息的编码、传输及 基于某些特殊功能对消息的特殊处理,而绑定对象是信道栈的缔造者,不同的绑定类型创建出来的信道栈具有不同的特性。就对会话的支持来讲,我们可以将信道分 为以下两种:

会话信道(Sessionful Channel):会话信道确保客户端和服务端之间传输的消息能够相互关联,但是信道的错误(Fault)会影响后续的消息交换; 


数据报信道(Datagram Channel):即使在同一个数据报信道中,每次消息的交换都是相互独立,信道的错误也不会影响后续的消息交换。 


由于上面的例子中,我们采用了WsHttpBinding,所以在默认条件下创建的信道(Channel)是会话信道(Sessionful Channel)。异常抛出后,当前信道的状态将变成Faulted,表示信道出现错误。错误的信道将不能继续用于后续的通信,即使是调用Close方法试图将其关闭也不行。


解决方案

我们在Web服务层用try catch 语法重新封装FaultException异常。


C# Code:

public class DataDictService : IDataDictService
{

/// <summary>
/// 删除一条数据字典记录
/// </summary>
/// <param name="loginTicket"></param>
/// <param name="keyValue">主键</param>
/// <param name="ORM_TypeName">ORM类型</param>
/// <returns></returns>
public bool Delete(byte[] loginTicket, string keyValue, string ORM_TypeName)
{
   try
   {
      Loginer loginer = WebServiceSecurity.ValidateLoginer(loginTicket);
      dalBaseDataDict dict = dalBaseDataDict.CreateDalByORM(loginer, ORM_TypeName);//创建DAL层实例
      return dict.Delete(keyValue);
   }
   catch (Exception ex)
   {
      throw new FaultException(ex.Message);//转换为客户端可截取的异常类型(FaultException)信息。
      //throw new FaultException("删除记录发生错误!");//或者提示更具体的异常信息,屏蔽WCF系统内部消息。
   }
}

}

//来源:C/S框架网(www.csframework.com) QQ:1980854898



客户端获取FaultException异常成功!
 


贴图图片




C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

解决方案WCF客户无法获取服务异常详细信息
3.0高级版:客户无法获取服务异常详细信息
WCF开发环境客户调试服务跟踪代码不能命中断点解决方案
WebServiceSecurity.ValidateLoginer方法要异常
运行客户错:无法打开登录所请求数据库,登录失败
C#源代码安全缺陷与提高源代码质量解决方案-WCF服务配置安全
由于内部错误,服务器无法处理该请求。有关该错误详细信息,请打开服务器上 IncludeExceptionDetailInFaults
SQL主动异常RAISERROR用法
服务增加WCF服务全局异常处理机制
WCF开发框架-客户采用Certificate认证模式调用基于HTTPS协议WCF接口
WCF:(400) Bad Request 错误解决方案
WCF客户服务配置要点
解决方案:启动WebApiServer失败,调用目标发生了异常
WCF错误:服务器无法处理该请求IncludeExceptionDetailInFaults
WCF开发框架-客户采用Windows身份认证调用HTTPS协议WCF接口
WCF开发框架-客户采用BASIC身份认证调用HTTPS协议WCF接口
调用WCF服务System.ServiceModel.ServiceActivationException:"无法激活请求服务"
连接WCF服务错误:调用方未由服务进行身份验证,无法满足对安全令牌请求
使用批处理文件(.bat)安装WCF服务失败解决方案
C#源代码安全缺陷与提高源代码质量解决方案