C#服务中字典转ArrayofKeyValueTypeType[随机字符]的原因咨询
为什么Dictionary在WSDL中会被转换为带随机后缀的ArrayofKeyValueTypeType?
嘿,这个问题我之前帮不少开发者排查过,其实背后是.NET SOAP服务序列化时的命名冲突处理逻辑在起作用~
首先你说得没错,SOAP和WSDL本身并没有原生支持字典类型,所以.NET的序列化组件(不管是XmlSerializer还是DataContractSerializer)都会把Dictionary<TKey, TValue>转换成键值对数组的结构,这就是你看到的ArrayOfKeyValueTypeType这类命名的由来——它本质就是用来模拟字典的键值对集合。
至于末尾的随机字符,核心原因是类型命名冲突:
- 如果你在服务中同时使用了多个不同泛型参数的Dictionary(比如
Dictionary<string, int>和Dictionary<string, string>),默认情况下它们生成的基础类型名会非常相似(比如ArrayOfKeyValueOfstringint和ArrayOfKeyValueOfstringstring); - 或者你的项目中已经存在了和这些默认命名重复的自定义类型;
为了保证WSDL中每个类型的名称都是唯一的(避免客户端生成代码时出现编译错误),.NET的WSDL生成工具(比如svcutil.exe或者wsdl.exe)会自动在冲突的类型名后面加上随机字符后缀,以此来区分不同的字典类型。
举个实际例子
你的C#服务对象可能是这样:
[DataContract] public class UserServiceRequest { [DataMember] public Dictionary<string, int> UserScores { get; set; } [DataMember] public Dictionary<string, string> UserProfile { get; set; } }
对应的WSDL片段就会出现带随机后缀的类型:
<xs:complexType name="ArrayOfKeyValueOfstringintz3Z5X2"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="KeyValueOfstringintz3Z5X2"> <xs:complexType> <xs:sequence> <xs:element name="Key" type="xs:string"/> <xs:element name="Value" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="ArrayOfKeyValueOfstringstringa1B2C3"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="KeyValueOfstringstringa1B2C3"> <xs:complexType> <xs:sequence> <xs:element name="Key" type="xs:string"/> <xs:element name="Value" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType>
怎么避免随机后缀?
如果你想让WSDL里的类型名更整洁,完全可以手动指定自定义名称,只需要继承Dictionary并加上CollectionDataContract特性:
[CollectionDataContract(Name = "UserScoreDictionary", ItemName = "ScoreEntry")] public class UserScoreDictionary : Dictionary<string, int> { } [CollectionDataContract(Name = "UserProfileDictionary", ItemName = "ProfileEntry")] public class UserProfileDictionary : Dictionary<string, string> { }
之后再在服务对象里使用这些自定义字典类型,生成的WSDL就会用你指定的名称,再也不会出现随机后缀啦~
内容的提问来源于stack exchange,提问作者MaverickCode
相关产品推荐
相关产品推荐

