c# - WCF 是否抑制第一次机会异常?

标签 c# linq wcf exception

我有一个 WCF 服务,它使用 LinqToSql DataContext 从数据库中提取一些信息。该操作的返回类型为 IEnumerable <DomainObject >,并且我有一个辅助方法,可以将派生的 LINQ 对象转换为 WCF 数据协定,如下所示:

[OperationContract]
public IEnumerable<DomainObjectDTO> RetrieveDomainObjects()
{
    var context = CreateDataContext();
    return from domainObject in context.DomainObjects
           select ConvertDomainObject(domainObject);
}

private DomainObjectDTO ConvertDomainObject(DomainObject obj)
{
    // etc...
}

如果我将无效的连接字符串传递给 DataContext,此代码会表现出奇怪的行为。由于无法找到正确的数据库,可能上面的代码在枚举 IEnumerable <DomainObjectDTO 时抛出了 SqlException。 > 当序列化发生时。但是,当我在调试器中运行此代码时,我在服务器端根本看不到任何第一次机会异常!我在“异常”选项卡中告诉调试器中断所有抛出的 CLR 异常,但它根本没有。我也没有在“输出”窗口中看到特征性的“第一次机会异常”消息。

在客户端,我收到一个 CommunicationException,其中包含“套接字连接意外终止”的错误消息。没有一个内部异常提供任何关于问题根本原因的提示。

我能解决这个问题的唯一方法是重写 LINQ 代码,使查询表达式在 OperationContract 方法内部求值。顺便说一下,如果存在权限问题,或者如果我将 DataContext 包装在 using 语句中,我会得到相同的结果,因此这不仅仅是与 SqlExceptions 隔离。

忽略使返回类型成为 IEnumerable 的不可取性 <T > 并且仅在序列化程序深处的某处枚举查询,WCF 是否抑制或以某种方式防止在这种情况下抛出异常?如果是这样,为什么?

最佳答案

至少在我的经验中,WCF 似乎确实对异常有一些魔力。我真的不确定它对异常有什么作用,但我发现如果 FaultContract 属性用于指定契约(Contract)可能抛出的异常,它至少会向客户提供更多关于错误原因的信息发生了。

我们还会捕获任何异常并将它们作为 FaultExceptions 重新抛出,例如:

try
{
    DoSomething();
}
catch ( Exception ex )
{ 
   throw new FaultException<CustomException>( new CustomException( ex ), ex.Message );
}

在错误契约中指定自定义异常的地方。这似乎向客户提供了有关异常的更多信息。所以我怀疑如果您将 SQLException 添加为 FaultContract 的一部分,那么它将被发送到客户端。

关于c# - WCF 是否抑制第一次机会异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261539/

相关文章:

c# - 使用 linq 填充子对象

c# - 扩展方法不更新传入的对象

asp.net-mvc - 如何通过LINQ表达式从数据库中获取处于特定角色的所有应用程序用户的列表?

c# - 如何从 Services .NET 中过滤掉 WCF 异步方法

wcf - Wcf basicHttpBinding 是否支持 PerSession?

wcf - 自托管 WCF - 是否需要命名空间预留?

c# - ASP.NET 身份和 ASP.NET 成员身份提供程序 "Mashup"

c# - C# 与 LISP 中的函数式编程

c# - MVC和MVVM框架的ViewModel部分位于哪一层?

C# - TakeWhile 和 SkipWhile 不返回?