WCF接口作为参数

Raj*_*mar 7 wcf

我在OperationContract中使用interface作为输入参数.但是当我在客户端生成代理类时.我无法访问实现ITransaction接口的接口或类的成员.我只是geeting是对象

  1. 服务接口

    [ServiceContract]
    public interface IServiceInterface
    {
    [OperationContract]
    string SyncDatabase(ITransaction TransactionObject);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 服务类

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

    public interface ITransaction
    {
        ExpenseData ExpData { get; set; }
        void Add(ITransaction transactionObject);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 数据合同

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

在上面的情况下,我还应该在客户端上复制iTransaction类和接口

小智 6

实际上,您需要让ServiceContract知道您作为参数传递的接口的实现,因此WCF会将其包含在WSDL中.

这应该工作:

[ServiceContract]
[ServiceKnownType(typeof(Transaction))]
public interface IServiceInterface
{
     [OperationContract]
     string SyncDatabase(ITransaction TransactionObject);
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ike 0

尝试使您的接口成为[DataContract]并使用该[KnownType]属性告诉 WCF 该接口的已知实现是什么。

[DataContract]
[KnownType(typeof(Transaction))]
public interface ITransaction
{
    [DataMember]
    ExpenseData ExpData { get; set; }
    void Add(ITransaction transactionObject);
}
Run Code Online (Sandbox Code Playgroud)

  • 来自msdn:`[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Struct,Inherited = true,AllowMultiple = true)]公共密封类KnownTypeAttribute:Attribute`...意味着该属性不能应用于接口...这是DataContractAttribute 相同 (8认同)