WCF接口作为参数

7

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

  1. Service Interface

    [ServiceContract]
    public interface IServiceInterface
    {
    [OperationContract]
    string SyncDatabase(ITransaction TransactionObject);
    }
    
  2. Service class

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

    public interface ITransaction
    {
        ExpenseData ExpData { get; set; }
        void Add(ITransaction transactionObject);
    }
    
  4. Data Contract

    [DataContract]
    public class Transaction:ITransaction
    {
        [DataMember]
        public ExpenseData ExpData
        {
            get;
            set;
        }
    
        public void Add(ITransaction transactionObject)
        {
    
        }
    
     }
    
在这种情况下,我是否还应该在客户端上复制iTransaction类和接口?
3个回答

6

您需要让ServiceContract意识到作为参数传递的接口实现,这样WCF才会将其包含在WSDL中。

可以尝试以下方法:

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

2

第二个链接很棒。简而言之,使用类作为参数类型,而不是接口。 - Logan

0

尝试将您的接口设置为[DataContract],并使用[KnownType]属性告诉WCF该接口的已知实现。

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

1
当我按照您的方法操作时,一切都很好。但是我的第二个问题仍然没有得到解答。当我创建服务的代理时,客户端上没有得到Transaction类。我该怎么做才能在客户端上也获得这个类呢? - Raj Kumar
实际上,[KnownType(typeof(Transaction))] 应该告诉 WCF 在 WSDL 中包含该类型,所以我不确定为什么这对您不起作用。您确定在更改后重新生成了客户端吗? - CodingWithSpike
8
从 msdn 上可以看到:[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Struct, Inherited=true, AllowMultiple=true)] public sealed class KnownTypeAttribute : Attribute... 这意味着该属性不能应用于接口... DataContractAttribute 也是如此。 - Charles HETIER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接