【发布时间】:2009-09-12 14:29:50
【问题描述】:
我正在尝试解决 WCF 和枚举的问题,我尝试将对象从服务器传递到包含枚举的客户端(或另一台服务器)。枚举故意从 1 开始。初始化枚举并在其中定义值时一切正常,但是当枚举中未定义它时,我收到了这个美妙的(并且非常具有描述性(...))错误消息:
“底层连接已关闭:连接意外关闭。”
我试图实现的是当我从数据库中损坏的数据(无论如何都被强制转换到枚举中,这非常奇怪)或者当开发人员在启动时忘记设置枚举值时遇到这种情况对象,以获得有意义的消息,例如“枚举值无效,类型:{0},值:{1}”。
我尝试在类中枚举的 setter 和 getter 上使用“Enum.IsDefined”,并向客户端(或其他服务器)抛出有意义的异常,但仍然得到“连接关闭”错误(当允许调试服务器时,我会收到有意义的消息,但仅限于服务器端)。
这是枚举 setter 和 getter 的 sn-p:
private TestEnum m_TestEnum;
[DataMember]
public TestEnum TestEnum
{
get
{
if (Enum.IsDefined(typeof(TestEnum), m_TestEnum))
{
return m_TestEnum;
}
else
{
throw new ApplicationException("Enum value is not valid: " + m_TestEnum);
}
}
set
{
if (Enum.IsDefined(typeof(TestEnum), value))
{
m_TestEnum = value;
}
else
{
throw new ApplicationException("Enum value is not valid: " + value);
}
}
}
从 0 开始枚举(具有“未知”值)还不够好,因为我仍然可以获得枚举中不存在的值。我可以结合这两种解决方案,我检查“IsDefined”并将枚举设置为“未知”值,但仍然 - 这不是理想的解决方案,因为我们想了解这些情况以便在开发周期中解决它们.
你说什么? 谢谢, 尼尔。
【问题讨论】:
-
只是为了澄清问题:您不将对象从客户端传递到服务器-您正在传递序列化消息表示。客户端上的所有“对象”都将被序列化,作为消息(基于文本或二进制)发送,然后在服务器上再次反序列化(与响应返回的方式相同)。只是要清楚 - 没有 object 被传递
-
风格上的小问题——不要在你的代码中使用
ApplicationException。它不会比抛出Exception增加任何价值,因为从来没有直接捕获ApplicationException的情况。框架设计者自己反对它。这里有一些信息:cuttingedge.it/blogs/steven/pivot/entry.php?id=56 -
...相反,您可以考虑使用
ArgumentOutOfRangeException作为setter(是否需要在getter 中使用一个取决于默认字段值是否有效。