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; }
}
}