我创建了一个自定义异常InvalidSessionException
。但是,当尝试捕获或评估引发的异常是否属于该类型时,它不起作用。这意味着EX is
和Catch 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;
}
据我所知,抛出的异常是正确的类型。
更多信息:
ex.GetType().FullName
= "System.ServiceModel.FaultException1[[System.ServiceModel.ExceptionDetail, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
在服务上启用了重用类型?
答案 0 :(得分:1)
我认为您需要使用强类型FaultException<T>
。有点像...
免责声明:以下代码尚未经过测试
服务器端
[ServiceContract]
public interface ISampleService
{
[OperationContract]
[FaultContractAttribute(typeof(InvalidSessionException)]
void SampleMethod();
}
void SampleMethod()
{
...
throw new FaultException<InvalidSessionException>();
}
客户端
...
try
{
_wcfChannel.SampleMethod();
catch (FaultException<InvalidSessionException> ex)
{
// take appropriate action
}
}
其他阅读
答案 1 :(得分:1)
信用到期的信用
Nintey-这个答案的九分之一归功于Adriano Repetti在此页面上留下的评论。我刚刚自己测试了这个解决方案,因为我遇到了与上述问题中描述的完全相同的问题。
问题
参考&#34;配置服务参考&#34;模态窗口;只是因为你选择“在所有引用的程序集中重用类型”并不意味着它实际上会这样做 - 它似乎是一个懒惰的操作,基本上这些引用将在自动生成代码发生时生成匹配起来。
解决方案
因此,如果你真正检查标记你关心的内容,似乎可以保证使用它而不是也许。这是通过将单选按钮从“在所有引用的程序集中重用类型”更改为“在指定的引用程序集中重用类型”(第二个单选按钮选项)来实现的。
我的支持观察
这似乎特别影响了FaultExceptions,我不知道为什么,但确实如此。我的项目中的FaultExceptions是在服务引用的命名空间下生成的,而不是从引用的程序集中重新使用它们。
特别令人费解的是,当您查看服务引用代码的Reference.cs时,将专门描述namspace。即便如此,直到我完成上述描述之后才能正常工作。最后,我只想指出,这是打破佳能&#34;或者&#34;不是规范&#34;。