2012-07-05 73 views
4

我在OperationContract中使用接口作爲輸入參數。但是,當我在客戶端生成代理類。我無法訪問實現ITransaction接口的接口或類的成員。我只是geeting是對象WCF接口作爲參數

  1. 服務接口

    [ServiceContract] 
    public interface IServiceInterface 
    { 
    [OperationContract] 
    string SyncDatabase(ITransaction TransactionObject); 
    } 
    
  2. 服務類

    class SyncService:IServiceInterface 
    { 
    
        public string SyncDatabase(ITransaction TransactionObject) 
        { 
        return "Hello There!!";  
        } 
    } 
    
  3. 接口

    public interface ITransaction 
    { 
        ExpenseData ExpData { get; set; } 
        void Add(ITransaction transactionObject); 
    } 
    
  4. 數據合同

    [DataContract] 
    public class Transaction:ITransaction 
    { 
        [DataMember] 
        public ExpenseData ExpData 
        { 
         get; 
         set; 
        } 
    
        public void Add(ITransaction transactionObject) 
        { 
    
        } 
    
    } 
    

在上述情況下,我應該也複製在客戶端

回答

-1

嘗試使你的界面[DataContract],並使用[KnownType]屬性告訴WCF是什麼接口的已知的實現是。

[DataContract] 
[KnownType(typeof(Transaction))] 
public interface ITransaction 
{ 
    [DataMember] 
    ExpenseData ExpData { get; set; } 
    void Add(ITransaction transactionObject); 
} 
+1

當我按照你的方法一切都很好。但我的第二部分問題仍然存在。當我創建服務的代理時,我沒有在客戶端上獲得Transaction類。我該怎麼做才能在客戶端上得到這個課程。 – 2012-07-06 12:28:17

+0

實際上[KnownType(typeof(Transaction))]'應該告訴WCF在WSDL中包含該類型,所以我不確定爲什麼這對你不起作用。您確定在更改後重新生成客戶端嗎? – CodingWithSpike 2012-07-06 13:05:09

+6

從MSDN: '[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Struct,繼承=真,=的AllowMultiple真)] 公共密封類KnownTypeAttribute:Attribute' ...這意味着該屬性不能在接口上施加... 這與DataContractAttribute – 2013-08-05 09:29:39

4

實際上,你需要讓你的ServiceContract知道您作爲一個參數傳遞接口的實現,因此WCF將其包含在WSDL。

這應該工作:

[ServiceContract] 
[ServiceKnownType(typeof(Transaction))] 
public interface IServiceInterface 
{ 
    [OperationContract] 
    string SyncDatabase(ITransaction TransactionObject); 
}