gpt4 book ai didi

c# - 具有松散类型参数的 WCF OperationContract

转载 作者:太空狗 更新时间:2023-10-30 00:26:40 26 4
gpt4 key购买 nike

我想在我的网络方法中使用松散类型的参数。

我有一个场景,其中客户端可以将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com