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

时间:2014-02-11 20:22:58

标签: c# wcf web-services exception

我创建了一个自定义异常InvalidSessionException。但是,当尝试捕获或评估引发的异常是否属于该类型时,它不起作用。这意味着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;
}

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

enter image description here

更多信息:

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

在服务上启用了重用类型? enter image description here

2 个答案:

答案 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在此页面上留下的评论。我刚刚自己测试了这个解决方案,因为我遇到了与上述问题中描述的完全相同的问题。

问题
Configure Service Reference window assemblies section

参考&#34;配置服务参考&#34;模态窗口;只是因为你选择“在所有引用的程序集中重用类型”并不意味着它实际上会这样做 - 它似乎是一个懒惰的操作,基本上这些引用将在自动生成代码发生时生成匹配起来。

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

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

特别令人费解的是,当您查看服务引用代码的Reference.cs时,将专门描述namspace。即便如此,直到我完成上述描述之后才能正常工作。最后,我只想指出,这是打破佳能&#34;或者&#34;不是规范&#34;。