Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 枚举和WCF-有意义的错误?_.net_Wcf_Enums - Fatal编程技术网

.net 枚举和WCF-有意义的错误?

.net 枚举和WCF-有意义的错误?,.net,wcf,enums,.net,Wcf,Enums,我试图克服WCF和枚举的一个问题,我试图将一个对象从服务器传递到包含枚举的客户端(或另一台服务器)。枚举故意以1开头。初始化枚举并在其中定义值时,一切都会正常进行,但如果枚举中未定义值,我会收到一条极好的(非常具有描述性的(…)错误消息: “基础连接已关闭:连接意外关闭。” 我试图实现的是,当我从数据库中损坏的数据(无论如何都会被强制转换到enum,这是非常复杂的)或者当开发人员在初始化对象时忘记设置enum值时,得到一条有意义的消息,比如“enum值无效,类型:{0},值:{1}” 我曾尝试在

我试图克服WCF和枚举的一个问题,我试图将一个对象从服务器传递到包含枚举的客户端(或另一台服务器)。枚举故意以1开头。初始化枚举并在其中定义值时,一切都会正常进行,但如果枚举中未定义值,我会收到一条极好的(非常具有描述性的(…)错误消息:

“基础连接已关闭:连接意外关闭。”

我试图实现的是,当我从数据库中损坏的数据(无论如何都会被强制转换到enum,这是非常复杂的)或者当开发人员在初始化对象时忘记设置enum值时,得到一条有意义的消息,比如“enum值无效,类型:{0},值:{1}”

我曾尝试在类中枚举的setter和getter上使用“Enum.IsDefined”,并将有意义的异常抛出到客户端(或其他服务器),但仍然出现“连接关闭”错误(当允许调试服务器时,我只在服务器端收到有意义的消息)

下面是枚举设置器和获取器的一个片段:

    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;
}