2011-12-21 151 views
0

我有一個我想公開的WCF服務方法。具有相同類型名稱的WCF服務類型,相同的XSD名稱空間

服務方法參數類型是具有相同類名稱和XML名稱空間的所有類型的基類。

所有派生類型在不同的C#名稱空間中,但必須在同一個xml名稱空間中公開。以下是實施。

但是,嘗試添加說明重複的Shape類型的服務引用時發生錯誤。

理想情況下,Visual Studio應爲第二個Shape自動分配一個C#名稱空間(例如Set1.Shape,Set2.Shape)。所以它可以下載所有類型。

任何想法將非常感激。

[ServiceContract] 
public interface IShape 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(Set1.Shape))] 
    [ServiceKnownType(typeof(Set2.Shape))] 
    void GetShape(ShapeBase shape); 
} 

public class ShapeBase : IShape { } 

//Example only. 
namespace Set1 
{ 
    public class Shape : ShapeBase { } 
} 

namespace Set2 
{ 
    public class Shape : ShapeBase { } 
} 

更新

我能夠把它們發佈在WCF服務端,這讓人想到它不能做客戶端上的相同的原因,是因爲WSDL不支持的編程名字空間像C#這樣的語言。

回答

0

每種類型都必須具有XML名稱空間和XML名稱的唯一組合。因此,如果您的類型必須位於相同的XML名稱空間中,則它們必須具有不同的元素名稱。目前他們很可能沒有,因爲CLR類型名稱是相同的。

+0

CLR類型名稱相同,但它們位於不同的名稱空間中。這可能是因爲WSDL不支持C#名稱空間,或者wcf客戶端沒有關於何時分配不同名稱空間的信息。 – Pingpong 2011-12-21 23:37:22

+0

默認情況下,CLR名稱空間用於創建XML名稱空間,但它會爲每個類導致不同的XML名稱空間,這是您提到的不可選項。一旦重新定義了XML名稱空間,就不再使用CLR名稱空間。 – 2011-12-21 23:46:11

0

正如Ladislav所說,您需要在同一個XML名稱空間內有不同的節點名稱。您可以通過使用DataContractAttribute的Name屬性來對此進行歸屬:

namespace Set1 
{ 
    [DataContract(Name="Set1Shape")] 
    public class Shape : ShapeBase { } 
} 

namespace Set2 
{ 
    [DataContract(Name="Set2Shape")] 
    public class Shape : ShapeBase { } 
} 
+0

我知道。必須具有相同的發佈類型名稱和相同的xml名稱空間。您的建議有不同的發佈類型名稱。 – Pingpong 2011-12-22 10:45:19

+1

@Pingpong:這個要求是不可能實現的。反序列化不會知道使用哪種類型。 – 2011-12-22 10:58:08

+0

跨XML Web服務邊界公開類型的唯一方法是將XML名稱空間與該類型的根節點名稱結合使用。這*定義了你正在暴露的類型。你所要做的並不合乎邏輯。沒有別的可以表明類型不一樣的東西。因此,你會告訴你這個錯誤信息。 – 2011-12-22 10:59:42

相關問題