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

标签 c# wcf operationcontract

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

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

相关文章:

c# - 让 WCF 回调与 netTcpBinding 一起工作

c# - 如何在 WCF 响应中重命名 xml root?

c# - 通过 WCF 提供整个库的功能

c# - 读取文本文件并继续格式化

c# - 使用 Excel Interop 关闭 Excel 应用程序而不保存消息

c# - 表之间的关系

c# - 通过 Azure 服务总线读取从 WCF 服务返回的流时出现 IOException 和 SocketException

C# using 子句 - 说明

wcf - 无法验证消息中的至少一个安全 token

c# - WCF 类在具有相同名称的不同服务契约(Contract)中实现两个操作契约(Contract)