2010-11-15 50 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