【发布时间】:2012-06-22 16:06:05
【问题描述】:
我正在开发 WCF 服务。
其中一个 OperationContracts 需要一个复杂类型作为参数之一(具体为 System.Exception)。
当我创建一个新的异常时客户端调用代理,例如。
System.Exception toNewException = new Exception();
然后发送它......它工作得很好。
但如果我尝试发送“System.Web.HttpUnhandledException”类型的异常。服务故障类型未知。 (见下面的错误)
尝试序列化参数时出错 http://tempuri.org/:Exception。 InnerException 消息是“类型 带有数据合同名称的“System.Web.HttpUnhandledException” 'HttpUnhandledException:http://schemas.datacontract.org/2004/07/System.Web' 预计不会。将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用 KnownTypeAttribute 属性 或者通过将它们添加到传递给的已知类型列表中 DataContractSerializer.'。有关详细信息,请参阅 InnerException。
我研究了已知的类型属性...但到目前为止我还没有找到任何有用的示例或文档。
任何人都知道有关我如何能够更改我的客户端/服务器以接受/处理任何类型的异常的信息的良好来源?
为了让我的问题更详细一点......错误状态; '将任何静态未知的类型添加到已知类型的列表中'。这就是我想知道如何专门针对像 system.exception 这样的复杂 .net 对象做的事情。
更新
我尝试进行以下更改:
[OperationContract]
[ServiceKnownType(typeof(HttpUnhandledException))]
void LogError(Exception Exception, Boolean LogInternalFlag, int UserId, int ApplicationId, int SeverityId);
我最终得到了另一个错误!
尝试序列化参数时出错 http://tempuri.org/:Exception。 InnerException 消息是“类型 带有数据合同名称的“System.Collections.ListDictionaryInternal” 'ArrayOfKeyValueOfanyTypeanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays' 预计不会。将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用 KnownTypeAttribute 属性 或者通过将它们添加到传递给的已知类型列表中 DataContractSerializer.'。有关详细信息,请参阅 InnerException。
至少这个异常的错误是有道理的......我完全不确定这意味着什么。
我还要说明一下,我确实尝试将异常序列化为 xml 并将其作为字符串传递......不幸的是,这并不像听起来那么简单,而且有很多因素需要考虑用于异常和任何内部异常的序列化。
【问题讨论】:
-
您尝试将什么添加到您的 web.config 中?
-
为什么要发送异常?您是否看过 FaultContracts,这通常是如何使用 WCF 处理异常的方式。
-
@JasonDeOliveira 听起来 OP 正在尝试将异常作为参数传递给此 WCF 服务,并且在发送从 parm 列表中指定的类型继承的类型时遇到问题...跨度>
-
@Nate 正确。我将异常作为参数传递。