2010-11-15 49 views
2

当我使用WCF暴露DataContract作为SOAP wevservice我得到一些时髦genenerated的名字,如:背后有什么WCF的逻辑产生名字DataContracts

[Flags] 
public enum EnumType1 
{ 
    EnumMember1 = 1; 
    EnumMember2 = 2; 
    EnumMember3 = 4; 
} 

[DataMember] 
private Dictionary< EnumType1, Class1> Class1Dictionary; 

拥有对线材这块肥皂表示:(我是释义):

<Class1Dictionary> 
    <KeyValueOfEnumType1Class1UTLV0zE5> 
     <Key>EnumMember1 </Key> 
     <Value> ... </Value> 
    </KeyValueOfEnumType1Class1UTLV0zE5> 
</Class1Dictionary> 

KeyValueOfEnumType1Class1UTLV0zE5背后的逻辑是什么?我可以解释KeyValueOfEnumType1Class1部分,但UTLV0zE5来自哪里?此外,如果这个任意字符串收费,WCF客户端会中断吗?

回答

0

它看起来有点随机给我。我不知道这个放克是不是随机的,并且会受到会破坏合同的变化的影响。

但如果你是在寻找少funcky WSDL的,解决方法(从here)是继承字典和使用CollectionDataContractAttribute序列化过程中改写输出:

[CollectionDataContract(
    Name="MyDictionary", ItemName="Items", KeyName="Key", ValueName="Value")] 
public class MyDictionary: Dictionary<EnumType1, Class1> 
{   
} 

应该生成XML,如:

<MyDictionary> 
    <Items> 
     <Key>EnumMember1</Key> 
     <Value> ... </Value> 
    </Items> 
</MyDictionary> 
+0

好点,但它仍然没有回答这些问题是如何生成的,WCF需要它们专门用于服务兼容性。 – 2010-11-16 01:53:41

+0

@David Reis - 我很想知道它们是如何生成的 - 它们看起来很随意。我无法真正想象为什么他们出于兼容性原因在那里。对我来说,更可能的是WSDL类型需要是唯一的,使用默认名称会导致更高的碰撞可能性 - 因此它会附加一些base64编码的字符以降低可能性。很明显,改变它们会破坏客户和服务之间的服务合同,所以我怀疑它们每次都是随机的。也许这是服务名称或类似的哈希。 – sheikhjabootie 2010-11-16 05:50:18

+0

事实证明,不管是什么方法,都没关系,因为无论生成的字符串是什么,DataContracts都被认为是兼容的。 – 2010-12-10 09:14:58