2014-05-15 89 views
0

我在Shared.DataContracts DLL後續類返回一個包含WCF服務列表成員的對象

[DataContract] 
public class TestClass 
{ 
    [DataMember] 
    public int Group { get; set; } 

    [DataMember] 
    public List<TestClassTwo> Member { get; set; } 
} 

[DataContract] 
public class TestClassTwo 
{ 
    [DataMember] 
    public long MessageId { get; set; } 

    [DataMember] 
    public RequestOpType ResultType { get; set; } 
} 

[DataContract(Name = "RequestOperationType")] 
public enum RequestOpType 
{ 
    [EnumMember] 
    Add, 
    [EnumMember] 
    Delete, 
    [EnumMember] 
    Update, 
    [EnumMember] 
    Retrieve, 
    [EnumMember] 
    Search 
} 

我的服務合同如下:

[ServiceContract] 
public interface IConnectorService 
{ 
    [OperationContract] 
    void PustRequestToWorkBuffer(TestClass test); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class ConnectorService : IConnectorService 
{ 
    public void PustRequestToWorkBuffer(TestClass test) 
    { 
     return; 
    } 
} 

當我嘗試將以下內容作爲服務引用添加到我的項目之一我總是收到WSDL引發的錯誤。該項目有一個對Shared.DataContracts DLL的引用。因此,我通過在'引用程序集中重複使用類型'複選框打勾來添加服務引用。如果我從TestClass中刪除List<TestClassTwo>,並只用TestClassTwo成員,它工作正常更換

Warning 68 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: Referenced type 'Poc.Shared.DataContract.TestClass, Poc.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' with data contract name 'TestClass' in namespace ' http://schemas.datacontract.org/2004/07/Poc.Shared.DataContract ' cannot be used since it does not match imported DataContract. Need to exclude this type from referenced types. XPath to Error Source: //wsdl:definitions[@targetNamespace=' http://tempuri.org/ ']/wsdl:portType[@name='IConnectorService'] S:\src\source\MetaConnector\Service References\ServiceReference1\Reference.svcmap 1 1 MetaConnector

我得到這個錯誤:

Error 73 Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details. S:\src\test\source\test\Connector\Service References\ServiceReference1\Reference.svcmap 1 1 MetaConnector

的警告。看起來像列表是我的問題的原因。

我需要重新使用共享程序集中的類型,因此取消選中此選項不適用(即使會刪除該錯誤)。

編輯:我認爲視覺工作室的「添加服務參考」功能是基於閱讀周圍有點片狀。由於我控制了客戶端和服務器,我重新考慮了我的代碼以分享合同並使用ChannelFactory代替。 儘管我確實在一個單獨的解決方案中使用了相同的合同,但一切似乎都沒有問題。我有一種感覺,客戶端和服務器解決方案有一些問題,他們正在尋找Shared.DataContracts.DLL的不同版本。

+0

我測試過它在我的電腦上工作正常。列表中沒有問題 –

+0

您是使用Visual Studio還是svcutil? –

+0

是的,我正在使用VS –

回答

0

嘗試增加新DataContract,如:

[DataContract] 
public class ListTestClassTwo 
{ 
    [DataMember] 
    public List<TestClassTwo> Member { get; set; } 

    public ListTestClassTwo() 
    { 
     Member = new List<TestClassTwo>(); 
    } 
} 

然後裏面的TestClass定義它,如:

[DataContract] 
public class TestClass 
{ 
    [DataMember] 
    public int Group { get; set; } 

    [DataMember] 
    public ListTestClassTwo ListOfMembers { get; set; } 
} 

我認爲這應該工作。

OR或者你可以嘗試KnownTypeTestClassTwo超過TestClass,如:

[DataContract] 
[KnownType(typeof(TestClassTwo))] 
public class TestClass 
{ 
    [DataMember] 
    public int Group { get; set; } 

    [DataMember] 
    public List<TestClassTwo> Member { get; set; } 
} 

更新:

如果你是重用組件使裝配確保相同版本的到處引用它使用了。每當我遇到有Cannot import wsdl:portType Detail的錯誤時,總是與重用的組件版本不匹配有關。

上次我遇到類似的問題,那就是我在某些DataContract &中加入了一些屬性,但是它被重用,但是從舊的版本引用的舊版本沒有新增加的屬性,這是問題的原因。

+0

同樣的問題。 –

+0

@Science_Fiction,更新了答案,請確保重新使用相同版本的程序集。 –

相關問題