Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
C# WCF服务中未定义的枚举值_C#_Wcf - Fatal编程技术网

C# WCF服务中未定义的枚举值

C# WCF服务中未定义的枚举值,c#,wcf,C#,Wcf,我们的WCF服务公开了“客户”类型,即: [DataContract(Name = "CustomerData", Namespace = "http://www.testing.com")] public partial class Customer { [DataMember] public CustomerLevel Level { get; set; } } [DataContract(Name=“Custome

我们的WCF服务公开了“客户”类型,即:

[DataContract(Name = "CustomerData", Namespace = "http://www.testing.com")] public partial class Customer { [DataMember] public CustomerLevel Level { get; set; } } [DataContract(Name=“CustomerData”,命名空间=”http://www.testing.com")] 公共部分类客户 { [数据成员] 公共客户级别 { 得到; 设置 } } 您可以看到上面的类型具有枚举类型的属性。此枚举的定义为:

[IgnoreCoverage] [DataContract(Namespace = "http://www.testing.com"")] public enum CustomerLevel : int { [EnumMember(Value = "Platinum")] Platinum = 1, [EnumMember(Value = "Gold")] Gold = 2, [EnumMember(Value = "Silver")] Silver = 3, [EnumMember(Value = "Bronze")] Bronze = 4, } [忽略覆盖范围] [DataContract(命名空间=”http://www.testing.com"")] 公共枚举客户级别:int { [EnumMember(Value=“Platinum”)] 铂金=1, [EnumMember(Value=“Gold”)] 黄金=2, [EnumMember(Value=“Silver”)] 银=3, [EnumMember(Value=“brown”)] 青铜=4, } 只要服务器为返回的每个客户发送一个有效的枚举,服务就可以正常工作。但是,如果服务返回枚举中未定义的CustomerLevel,则服务调用将超时

错误CustomerLevel值的示例可能是:

customer.Level = (CustomerLevel)0; customer.Level=(CustomerLevel)0; 如果客户端试图发送未定义的值,服务也会超时

是否有任何方法可以允许未定义的值流到客户端和服务器,并让它们各自处理错误值?

尝试从枚举值中删除
EnumMember
属性

此外,您不需要将枚举标记为
DataContract
,因为
DataContractSerializer
将自动序列化您在现有
DataContracts
中使用的任何枚举



我上面发布的内容不起作用。我认为不可能使用
DataContractSerializer
来序列化无效的枚举值。

我认为没有任何方法可以使用DataContract公开未定义的枚举

对于传播异常,您可以尝试启用“IncludeExceptionDetailsInFaults”-有关详细信息,请参阅


我通常要做的是实现一个IErrorHandler服务器端,它记录异常并将异常升级为故障-这里面有一些好东西。

我认为你不会让虚假的枚举正常工作。它们将反序列化为什么?如果你想让客户端发送整数,那么将类型更改为int,并将其转换为枚举on您自己的(使用您自己的错误处理)


至于客户端是否应该超时,请告诉我们您使用的是哪种客户端。此外,我建议您查看网络流量,并查看服务的响应情况(如果有)。另外,请查看Windows事件日志,查看服务是否有投诉。最后,您可能希望打开WCF跟踪,以查看服务的响应情况此操作。

您可以使用自定义IDataContractSurrogate将枚举映射到int,然后再映射回枚举

创建此类代理的文档如下所示:

这是我开发的一个通用版本,可以处理枚举类型列表。您可以在DataContractSerializer的构造函数中指定它。有关详细信息,请参阅我的博客文章:

//
///IDataContractSurrogate将枚举映射到int以处理无效值
/// 
公共类无效合同代理:IDataContractSurrogate
{
私有哈希集类型列表;
/// 
///创建新的数据协定代理以处理指定的枚举类型
/// 
///枚举类型
公共无效合同代理(类型)
{
typelist=新的HashSet();
如果(!type.IsEnum)抛出新的ArgumentException(type.Name+“不是枚举”,“type”);
类型列表。添加(类型);
}
/// 
///创建新的数据协定代理以处理指定的枚举类型
/// 
///枚举类型的IEnumerable
公共无效合同代理(IEnumerable类型)
{
typelist=新的HashSet();
foreach(类型中的变量类型)
{
如果(!type.IsEnum)抛出新的ArgumentException(type.Name+“不是枚举”,“type”);
类型列表。添加(类型);
}
}
#区域接口实现
公共类型GetDataContractType(类型类型)
{
//如果提供的类型在列表中,请告诉序列化程序它是int
if(typelist.Contains(type))返回typeof(int);
返回类型;
}
公共对象GetObjectToSerialize(对象对象,类型targetType)
{
//如果要序列化的对象的类型在列表中,请将其大小写为int
if(typelist.Contains(obj.GetType())返回(int)obj;
返回obj;
}
公共对象GetDeserializedObject(对象对象,类型targetType)
{
//如果目标类型在列表中,则将值(我们假设它是int)转换为枚举
if(typelist.Contains(targetType))返回Enum.ToObject(targetType,obj);
返回obj;
}
public void GetKnownCustomDataTypes(System.Collections.ObjectModel.Collection customDataTypes)
{
//不用
返回;
}
公共对象GetCustomDataToExport(类型clrType,类型dataContractType)
{
//不用
返回null;
}
公共对象GetCustomDataToExport(System.Reflection.MemberInfo MemberInfo,类型dataContractType)
{
//不用
返回null;
}
公共类型GetReferencedTypeOnImport(字符串typeName、字符串typeNamespace、对象customData)
{
//不用
返回null;
}
public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration,System.CodeDom.CodeCompileUnit compileUnit compileUnit)
{
//不用
返回类型声明;
}
#端区
}

至少对我来说,这个问题的答案是设置IsRequired=false。如下所示:

[DataMember(IsRequired = false)]
Nullable<MyEnum> Prop {get;set;}
[DataMember(IsRequired=false)]
可为空的属性{get;set;}

这会将nillble=“true”正确地添加到wsdl中…

我从枚举和be中删除了DataContract和EnumMember属性
[DataMember(IsRequired = false)]
Nullable<MyEnum> Prop {get;set;}