我有一个WCF服务,它使用LinqToSql DataContext从数据库中获取一些信息。该操作的返回类型是IEnumerable的<DomainObject
>和I具有从表衍生LINQ对象转换为WCF数据契约像这样一个辅助方法: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并且只在枚举序列化程序的深处枚举查询的不便之处,是WCF抑制还是以某种方式防止在这种情况下抛出异常?如果是这样,为什么?