2011-08-07 58 views
1

我有一個使用basicHttpBinding的WCF服務。在服務方法上,我有一個返回的類,對於這個類我需要動態/編程排除屬性並更改XML的屬性名稱。這需要在WSDL和服務方法被調用時完成。如何使用XmlAttributeOverrides與WCF

我已經尋找最好的解決方案,看起來我需要(1)使用XmlAttributeOverrides與XmlSerializer或(2)在需要自定義的類上實現IXmlSerializable。或者可能有更好的解決方案。我知道可以將屬性名稱+「指定」添加到課程中,然後可以排除這些屬性。但是,這並不排除在WSDL中,這不能解決屬性重命名問題。

爲什麼我要這個?由於我們的應用程序的全球化和定製化。我們的應用程序中內置了很多屬性,可能會被應用程序的用戶完全重命名或隱藏。

經過很多研究,我最好的選擇是用我自己的自定義序列化程序換出WCF序列化程序。但是,我從來沒有找到如何爲使用XmlSerializer的自定義類執行此操作的好例子。此外,我不知道我將如何傳遞給特定類的XmlAttributeOverrides。

另外,對於其他想要相同功能的人來說,情況可能並非如此,但在我的應用程序中,我只需要在應用程序的生命週期中初始化一次值。太糟糕了C#不允許靜態只讀變量與屬性一起使用。

這裏是一個類的一個簡單的例子:

public Customer 
{ 
    public string Address1 
    { 
    get; 
    set; 
    } 

    public string Address2 
    { 
    get; 
    set; 
    } 

    public string Zipcode 
    { 
    get; 
    set; 
    } 
} 

在這個例子中,我想在應用程序中使用POSTALCODE而不是郵政編碼的某些裝置和隱藏地址2財產。

非常感謝您的幫助。

感謝, 泰勒

回答

0

我知道這似乎有點像一個警察出來的,而是因爲你的對象屬性的名稱是動態的,爲什麼不直接使用屬性裝袋,而不是做這個的XMLSerializer洗牌?

+0

該OP提到了WSDL等 - 另外,一個屬性包在序列化佈局上提供了幾乎* no *的選擇。 –

+0

屬性包會將我的屬性名稱更改爲索引字符串,這使我可以實時靈活地選擇名稱。但是,我不認爲wsdl和客戶端消費對象會真正爲屬性索引器或數據類型獲得很好的定義。我真的需要更好的結構化XML和模式。我會爲我的OP添加一個示例。 – tbcarver

1

我們的應用程序中內置了很多屬性,可能會被應用程序的用戶完全重命名或隱藏。

標準方法是創建一個特殊的數據傳輸對象(DTO)。或幾個。

+0

這就是當我讀到這個問題時經歷過我的頭腦.... –

+0

是不是有任何類屬性DTO?我認爲從DTO構建xml和xml模式時,我已經有了一個DTO問題,我需要動態地排除和重命名這些屬性。您可以使用WCF中的DTO鏈接關於「標準方法」的文章來實現此目的嗎? – tbcarver

+0

而DTO的沒什麼特別的(恰恰相反)。要點是他們是爲傳輸工作而設計的。 –