wcf step by step之异常处理

分布式系统的异常处理比普通的应用程序的异常处理复杂的多,wcf的服务端异常抛出后,客户端是否能catch到,catch到的是否是我们期望的,我们通过demo来一步一步分析下去。
在我们以前的demo中我们未对异常进行任何的处理,一量异常发生,我们的系统则没有能力自我保护,轻微的错误会导到当前用户的操作失败,严重的是系统崩溃。我们总是习惯对于可以预见的错误以一种友好的方式来提醒用户,而不是把系统抛出的信息暴露给客户,因为这样可能会给我们的系统带来危害,这就是异常处理的原则。
下面我们通过改造以前的demo来看wcf对异常是怎么样处理的。
一、添加异常
string GetEmpNameByID(int id)接口是获取指定id的员工姓名,当id不存在时,我们希望抛出一个异常,客户端通过catch这个异常来告诉客户当前状况。
public string GetEmpNameByID(int id)
        {
            List<Employee> emps = Database.GetAll();
            var names = from p in emps
                        where p.ID == id
                        select p.Name;
            if (names.Count() > 0)
            {
                return names.First<string>();
            }

            throw new Exception("employee no exists");
        }
抛出一个Excepion的异常是一种简单的处理办法,实际应用不应当是这样的,此处仅为演示方便。
客户端在调用GetEmpNameByID时添加try/catch(Exception ex)并把异常的类型和异常的message打印出来。运行程序后,实际上我们看到的异常信息是这样的。
异常类型:System.ServiceModel.FaultException
异常信息:由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .NET Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志。
如果把这些信息显示给我们的用户,一点价值都没有。根据提示,我们在服务端的web.config中增加<serviceDebug>配置行为<serviceDebug includeExceptionDetailInFaults="True"/>,再次运行后。
异常类型:System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]
异常信息:employee no exists
呵呵,似乎很相似,只是类型不一样。可以看来在服务端抛出的异常总会是FaultException异常类,那么我们想得到具体的异常类型如何做呢。
wcf对自定义异常提供了支持,通过定义一个异常描述的契约,如
namespace Shore.cnblogs.com.WCFData
{
    [DataContract]
    public class EmployeeNotFind
    {
        [DataMember]
        public string Code;

        [DataMember]
        public string Message;
    }
}
我们把它入到WCFData组件中,因为这也是一个数据契约。
修改服务契约
[ServiceContract]
    public interface IEmployeeService
    {
        [OperationContract]
        void AddEmployee(Employee em);

        [FaultContract(typeof(EmployeeNotFind))]
        [OperationContract]
        string GetEmpNameByID(int id);
    }
注释trow new Exception("employee no exists");
改为
            EmployeeNotFind notFind = new EmployeeNotFind();
            notFind.Code = id.ToString();
            notFind.Message = "employee no exists";
            throw new FaultException<EmployeeNotFind>(notFind);
客户端
catch (System.ServiceModel.FaultException<EmployeeNotFind> fe)
            {
                EmployeeNotFind notfind = fe.Detail;
                Console.WriteLine("exception type={0},exception description={1}", notfind.GetType().ToString(), notfind.Message);
            }


下载Demo

1087227.html?type=1

shore 2008-03-01 14:55 发表评论

转载于:https://www.cnblogs.com/hotsoho.net/archive/2008/03/01/1206548.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WCF WebSocket是WCF 4.5中新增的一个功能,它支持在WCF中使用WebSocket协议进行通信。WebSocket是一种全双工通信协议,可以在客户端和服务器之间建立持久性的连接,实现实时的双向通信。\[1\] 然而,需要注意的是,WCF WebSocket只在Windows 8及以上的系统中支持,对于Windows 7等旧版本的系统则不支持。这是因为WCF WebSocket依赖于System.Net.WebSocket类,而该类也只在Windows 8及以上的系统中可用。\[2\] 在WCF中,可以使用NetHttpBinding和NetHttpsBinding这两个标准绑定来支持WebSocket传输。这两个绑定允许在标准的HTTP端口80和443上进行WebSocket通信,从而可以通过Web中介进行跨网络的通信。\[3\] 总结起来,WCF WebSocket是WCF 4.5中新增的功能,它支持使用WebSocket协议进行实时的双向通信。然而,需要注意的是,WCF WebSocket只在Windows 8及以上的系统中支持,并且可以使用NetHttpBinding和NetHttpsBinding这两个标准绑定来进行WebSocket通信。 #### 引用[.reference_title] - *1* *2* [在WCF中使用websocket](https://blog.csdn.net/weixin_34205826/article/details/85568070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [WCF websocket](https://blog.csdn.net/weixin_30699741/article/details/96370576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值