C# 如何在WCF服务中将接口作为参数传递?

C# 如何在WCF服务中将接口作为参数传递?,c#,wcf,C#,Wcf,我有以下几点,但我不确定这是正确的做法 namespace WCFServices { [ServiceContract(Name = "IService")] [ServiceKnownTypeAttribute(typeof(DataItem))] public interface IService { [OperationContract] void InstantiateThirdParties(string name, I

我有以下几点,但我不确定这是正确的做法

namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [ServiceKnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

我的方向正确吗?

如果所讨论的接口是在
IEnumerable
参数中使用的
IDataItem
,则需要将接口本身标记为已知类型:

[KnownTypeAttribute(typeof(IDataItem))]
查看此博客:

编辑:应为KnownTypeAttribute而非ServiceKnownTypeAttribute,因为papadi指出的内容正确

编辑2:

namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [ServiceKnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

namespace DataObjects
{
    [DataContract]
    [KnownType(typeof(IDataItem))]
    public class DataItem : IDataItem
    {
        ...
    }
}
名称空间WCFServices
{
[服务合同(Name=“iSeries”)]
[ServiceKnownTypeAttribute(类型(数据项))]
公共接口设备
{
[经营合同]
void实例化三方(字符串名称、IEnumerable数据、IEnumerable模块、IEnumerable状态);
}
}
命名空间数据对象
{
[数据合同]
[知识类型(类型(IDataItem))]
公共类数据项:IDataItem
{
...
}
}

您需要使用KnownTypeAttribute而不是ServiceKnownTypeAttribute。

您的意思是像下面这样吗

namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [KnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

你到底想达到什么目的?参数的作用是什么?WCF服务接受4个参数。其中一个恰好是IDataItem的接口类型。我需要告诉服务什么类型的对象正确使用该接口?这里只涉及
IEnumerable、
IDataItem`和
iSeries
。你到底是什么意思?在这篇帖子上找到答案。。。好的,我把这个注释放在哪里?比如下面?@TylerBuchanan,是的,你自己的答案似乎是正确的。那不行吗?您是否收到任何错误消息?它说“属性'KnownTypeAttribute'对此声明类型无效。它仅对'class,struct'声明有效。”好的,我将此批注放在哪里?这和我的答案一样吗?我想如果你把它放在iSeries之上,它应该会起作用。但通常我会把它放在IDataItem的顶部,以便更好地封装。对不起,我收回它,您的答案不完全正确。在您的服务声明中,您需要
ServiceKnownTypeAttribute
而不是
KnownTypeAttribute
DataItem
类标记正确)。为服务填写SoapUI请求,我将获得除数据参数以外的所有信息。列表是空的。
namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [ServiceKnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}

namespace DataObjects
{
    [DataContract]
    [KnownType(typeof(IDataItem))]
    public class DataItem : IDataItem
    {
        ...
    }
}
namespace WCFServices
{
    [ServiceContract(Name = "IService")]
    [KnownTypeAttribute(typeof(DataItem))]
    public interface IService
    {
        [OperationContract]
        void InstantiateThirdParties(string name, IEnumerable<IDataItem> data, IEnumerable<string> modules, IEnumerable<string> states);
    }
}
namespace DataObjects
{
    [DataContract]
    [Serializable]   <------ Not having this was my problem
    [KnownType(typeof(IDataItem))]
    public class DataItem : IDataItem
    {
        public DataItem();

        [DataMember]
        public CustomerInfo customer { get; set; }
        [DataMember]
        public LoanInfo loan { get; set; }
        [DataMember]
        public DateTime loanProcessingDate { get; set; }
        [DataMember]
        public string moduleID { get; set; }
        [DataMember]
        public string processingState { get; set; }
    }
}
namespace Interfaces
{
    public interface IDataItem
    {
        CustomerInfo customer { get; set; }
        LoanInfo loan { get; set; }
        DateTime loanProcessingDate { get; set; }
        string moduleID { get; set; }
        string processingState { get; set; }
    }
}