2012-07-05 75 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); 
}