2008-09-15 64 views
1

我有一個服務契約,它定義了一個類型爲System.Object(xs:anyType in the WSDL)的參數的方法。我希望能夠在此參數中傳遞簡單類型以及複雜類型。簡單類型工作正常,但是當我嘗試傳遞在我的WSDL中定義的複雜類型時,出現此錯誤:傳遞複雜類型的WCF問題

元素'http://tempuri.org/:value'包含'http://schemas.datacontract.org/2004/07/MyNamespace:MyClass'數據契約的數據。反序列化器不知道映射到此合約的任何類型。將與'MyClass'相對應的類型添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型列表中。

將它作爲已知類型添加並不會有幫助,因爲它已經在我的WSDL中。我如何通過「xs:anyType」參數傳遞一個複雜類型的對象?

更多信息:

我相信這一點使用NetDataContract時的作品,但因爲我的客戶是Silverlight的,我不能使用。

我已經看到了引用顯式擴展xs:anyType的複雜類型,但我不知道如何讓WCF生成這樣做的WSDL,我不知道它是否會幫助。

感謝

回答

1

我已經通過使用ServiceKnownType屬性解決了此問題。我只是將我的複雜類型添加爲我的服務合同中已知類型的服務,並且錯誤消失。我不知道爲什麼這是上次我嘗試它不起作用。

它似乎沒有以任何方式影響WSDL,所以我懷疑序列化的流必須有一些區別,告訴反序列化器該對象可以使用我的類型進行反序列化。

2

的NetDataContract工作,因爲NetDataContractSerializer包含類型信息。

KnownType屬性指示DataContractSerializer如何反序列化消息。作爲具體實現,這是超出公共合約定義的信息,不屬於WSDL。

因爲反序列化器需要識別適當的類型並創建一個實例,所以您永遠無法傳遞任何舊數據類型。

您可能能夠在運行時導出已知類型,而不是在DataContract中對它們進行硬編碼。看樣品here

0

嘗試使用數據契約代理映射不支持的對象,即dot net特定或不可互操作的類型。請參閱MSDN

0

我嘗試添加ServiceKnownType屬性,指定我想要傳遞的類型,但仍然收到相同的錯誤。 我也嘗試將KnownType屬性添加到我的數據契約(這看起來很愚蠢,因爲它與數據契約是同一類型)。我想如果在編譯時添加它們並沒有幫助,那麼在運行時添加它們將無濟於事。

如果我擴展了另一個複雜類型,在我看來,我想將KnownType屬性添加到該基類型。但是因爲我的基類型是Object,所以我沒有辦法做到這一點。

至於替代品,在我看來,這些用於包裝沒有定義合同的類型。但在我的情況下,我確定了合同。

1

我希望這會有所幫助。我看到我的一個同事使用這個代碼發送複雜的數據類型,而且對我來說這很簡單。這與basicHttpBinding一起使用,並且與MOSS BDC以及使用基本綁定的其他應用程序一起工作得非常好。

  1. 創建基於通用類
  2. 使用數據合同數據合同時的信息需要被髮送

    [DataContract(命名空間= 「http://Service.DataContracts」,名稱= 「ServiceDataContractBase」)] 公共類ServiceDataContract {

    public ServiceDataContract() { } 
    
    public ServiceDataContract(TValueType Value) 
    { 
        this.m_objValue = Value; 
    } 
    
    private TValueType m_objValue; 
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)] 
    public TValueType Value 
    { 
        get { return m_objValue; } 
        set { m_objValue = value; } 
    } 
    

    }

在WCF函數中需要使用此數據協定的情況下,它將返回複雜的數據類型。例如:

public ServiceDataContract<string[]> GetStrings() 
{ 
    string[] temp = new string[10]; 
    return new ServiceDataContract<string[]>(temp); 
} 

更新:ServiceDataContract是泛型類正在使用TValueType。它並不是因爲呈現HTML出現錯誤而出現的。

+0

感謝您的回覆。然而,這個實現仍然需要在服務合同中指定類型(或者我錯過了什麼?)。我希望能夠通過使用相同服務操作的非特定類型(可以是簡單類型或我的數據協定類型之一)。 – dcstraw 2008-09-17 17:07:08

0

現在我已經通過創建一個新的數據合約類型來解決這個問題,該類型可以包裝另一個數據合約類型或簡單類型。而不是傳遞類型對象,現在我傳遞這個包裝類。這工作正常,但我仍然想知道是否有原始問題的解決方案。