由客户端看不到相同类型的Web服务引发的自定义exception(使用共享程序集)

我创建了一个自定义exceptionInvalidSessionException 。 但是,当尝试捕获或评估引发的exception是否属于该类型时,它不起作用。 这意味着EX isCatch Ex都不会评估为InvalidSessionException

 try { acc = this.fda.GetAccountHeader(this.selectedTicket.AccountId); } catch (Exception ex) { if (ex is Enterprise.Data.InformationModel.CustomExceptions.InvalidSessionException) { this.lblError.Text = Resources.Resource.error_sessionedTimedOut; this.MPError.Show(); } return; } 

我也试过(结果没有任何差别)

 catch (Enterprise.Data.InformationModel.CustomExceptions.InvalidSessionException ex) { this.lblError.Text = Resources.Resource.error_sessionedTimedOut; this.MPError.Show(); return; } catch (Exception ex) { return; } 

据我所知,抛出的exception是正确的类型。

在此处输入图像描述

更多信息:

ex.GetType().FullName = "System.ServiceModel.FaultException1[[System.ServiceModel.ExceptionDetail, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

服务上是否启用了重用类型? 在此处输入图像描述

信用到期的信用
Nintey-这个答案9%的功劳归功于Adriano Repetti在本页留下的评论。 我刚刚自己测试了这个解决方案,因为我遇到了与上面问题中描述的完全相同的问题。

问题
配置服务引用窗口程序集部分

参考“配置服务引用”模式窗口; 只是因为你选择“在所有引用的程序集中重用类型”并不意味着它实际上会这样做 – 它似乎是一个懒惰的操作,如果自动生成代码碰巧匹配它,基本上会进行这些引用。

解决方案
因此,如果您实际上检查标记您关心的内容,似乎可以保证使用它而不是可能 。 这是通过将单选按钮从“在所有引用的程序集中重用类型”更改为“在指定的引用程序集中重用类型”(第二个单选按钮选项)来实现的。

我的支持意见
这似乎特别影响了FaultExceptions,我不知道为什么,但确实如此。 我的项目中的FaultExceptions是在服务引用的命名空间下生成的,而不是从引用的程序集中重用它们。

特别令人费解的是,当您查看服务引用代码的Reference.cs时,会专门描述namspace。 即便如此,直到我完成上述描述之后才能正常工作。 最后,我只想指出,这是“打破正典”或“不是规范”的一个很好的例子。

我相信你需要使用强类型的FaultException 。 就像是…

免责声明:以下代码尚未经过测试

服务器端

 [ServiceContract] public interface ISampleService { [OperationContract] [FaultContractAttribute(typeof(InvalidSessionException)] void SampleMethod(); } void SampleMethod() { ... throw new FaultException(); } 

客户端

 ... try { _wcfChannel.SampleMethod(); catch (FaultException ex) { // take appropriate action } } 

额外的阅读

  • MSDN: FaultException
  • remondo.net: 使用WCF类型的故障exception (一个简单的例子)
  • iDesign: WCF故障合同 (示例代码)
  • CodeProject: 初学者教程,用于理解WCF中的exception处理,FaultExceptions和FaultContracts