我想在我的网络方法中使用松散类型的参数。
我有一个场景,其中客户端可以将 25 个 DataContract 对象中的任何一个发送到 WCF 操作中,例如
proxy1.myFunction(PersonObject)
proxy1.myFunction(ComputerObject)
我的限制是只能向客户端公开一个操作合约。
如何设计一个可以将 25 个 DataContract 类中的任何一个作为参数的 Web 方法?我尝试使用 object
作为参数类型并将 KnownType
属性赋予 DataContract 类,但在序列化过程中我没有运气。
最佳答案
我刚刚做了这个,我发现你需要将 KnownTypesAttribute 添加到接口(interface)中。
[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
[OperationContract]
object TakeMessage();
[OperationContract]
void AddMessage(object contract);
}
在您的实现中,您需要检查类型以确保它是您的 DataContracts 之一。
编辑
如果你有很多合约,你可以使用反射将它们添加到 KnownTypes 中。
internal static class KnownTypeHelper
{
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null)
{
var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray();
return types;
}
}
然后你可以声明你的接口(interface),
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
[OperationContract]
object TakeMessage( );
[OperationContract]
void AddMessage(object contract);
}
这是一种更简洁的方法。
关于c# - 具有松散类型参数的 WCF OperationContract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10118513/