.net 枚举和WCF-有意义的错误?
我试图克服WCF和枚举的一个问题,我试图将一个对象从服务器传递到包含枚举的客户端(或另一台服务器)。枚举故意以1开头。初始化枚举并在其中定义值时,一切都会正常进行,但如果枚举中未定义值,我会收到一条极好的(非常具有描述性的(…)错误消息: “基础连接已关闭:连接意外关闭。” 我试图实现的是,当我从数据库中损坏的数据(无论如何都会被强制转换到enum,这是非常复杂的)或者当开发人员在初始化对象时忘记设置enum值时,得到一条有意义的消息,比如“enum值无效,类型:{0},值:{1}” 我曾尝试在类中枚举的setter和getter上使用“Enum.IsDefined”,并将有意义的异常抛出到客户端(或其他服务器),但仍然出现“连接关闭”错误(当允许调试服务器时,我只在服务器端收到有意义的消息) 下面是枚举设置器和获取器的一个片段:.net 枚举和WCF-有意义的错误?,.net,wcf,enums,.net,Wcf,Enums,我试图克服WCF和枚举的一个问题,我试图将一个对象从服务器传递到包含枚举的客户端(或另一台服务器)。枚举故意以1开头。初始化枚举并在其中定义值时,一切都会正常进行,但如果枚举中未定义值,我会收到一条极好的(非常具有描述性的(…)错误消息: “基础连接已关闭:连接意外关闭。” 我试图实现的是,当我从数据库中损坏的数据(无论如何都会被强制转换到enum,这是非常复杂的)或者当开发人员在初始化对象时忘记设置enum值时,得到一条有意义的消息,比如“enum值无效,类型:{0},值:{1}” 我曾尝试在
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”并将枚举设置为“Unknown”值,但这仍然不是理想的解决方案,因为我们希望了解这些情况,以便在开发周期中解决它们
你怎么说?
谢谢
Nir。通过WCF发送枚举时,将发送枚举值的字符串表示形式,而不是数值。这允许双方将相同的枚举标签映射到不同的数字 如果发送的标签未被收件人理解,则频道将关闭。我相信这会扩展到未定义的枚举的值(看起来您是在迎合这些值) 因此,仅仅因为enum标签在发送方是有效的,并不意味着客户端一定会理解它 您是否在发件人和收件人之间共享相同的类定义 要进一步调试此问题,您应该在客户端和服务器中启用服务跟踪(许多令人沮丧的WCF问题都是如此。)它将帮助您确定问题的根源,否则您将没有任何指示 将以下XML添加到App.config(在客户端和服务器上):
您可以读取。通过WCF发送枚举时,将发送枚举值的字符串表示形式,而不是数值。这允许双方将相同的枚举标签映射到不同的数字 如果发送的标签未被收件人理解,则频道将关闭。我相信这会扩展到未定义的枚举的值(看起来您是在迎合这些值) 因此,仅仅因为enum标签在发送方是有效的,并不意味着客户端一定会理解它 您是否在发件人和收件人之间共享相同的类定义 要进一步调试此问题,您应该在客户端和服务器中启用服务跟踪(许多令人沮丧的WCF问题都是如此。)它将帮助您确定问题的根源,否则您将没有任何指示 将以下XML添加到App.config(在客户端和服务器上):
您可以阅读。问题是序列化无法序列化枚举中未定义的值,这包括(默认)0值 例如:
enum E
{
New = 1,
Used
}
[OperationContract]
public E Method()
{
E e;
return e;
}
对方法的调用将失败,因为“e”被初始化为“e=(e)0”。当序列化尝试执行其工作时,它在E中找不到与0匹配的字段,因此失败(或生成与wsdl不匹配的xml,该wsdl将值限制为枚举成员)
因此,我们必须确保我们的服务方法始终返回有效值(根据枚举定义)
我在MSDN中没有看到任何关于这一点的讨论,所以这是我测试后得出的结论
希望有帮助,
Jose问题是序列化无法序列化枚举中未定义的值,这包括(默认)0值 例如:
enum E
{
New = 1,
Used
}
[OperationContract]
public E Method()
{
E e;
return e;
}
对方法的调用将失败,因为“e”被初始化为“e=(e)0”。当序列化尝试执行其工作时,它在E中找不到与0匹配的字段,因此失败(或生成与wsdl不匹配的xml,该wsdl将值限制为枚举成员)
因此,我们必须确保我们的服务方法始终返回有效值(根据枚举定义)
我在MSDN中没有看到任何关于这一点的讨论,所以这是我测试后得出的结论
希望有帮助,
Jose只是想澄清一下:您并没有将对象从客户端传递到服务器,而是传递了一个序列化的消息表示形式。客户端上的所有“对象”都将被序列化,作为消息(基于文本或二进制)发送,然后在服务器上再次反序列化(与响应返回时相同)。需要明确的是,在样式的次要点周围没有传递对象——不要在代码中使用
ApplicationException
。它不会在抛出Exception
上增加任何值,因为从来没有直接捕获ApplicationException
的情况。框架设计师们自己也反对这种做法。这里有一些信息:……代替您可以考虑使用<代码>(getter中是否需要一个取决于默认字段值是否有效。请澄清:您没有将对象从客户端传递到服务器-您正在传递一个序列化的消息表示形式。客户端上的所有“对象”都将被序列化,并作为消息(基于文本或二进制)发送,然后反序列化
enum E
{
New = 1,
Used
}
[OperationContract]
public E Method()
{
E e;
return e;
}