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
shore 2008-03-01 14:55 发表评论转载于:https://www.cnblogs.com/hotsoho.net/archive/2008/03/01/1206548.html
