4

我想在我的 web 方法中有一个松散类型的参数。

我有一个场景,客户端可以将 25 个 DataContract 对象中的任何一个发送到 WCF 操作中,例如

proxy1.myFunction(PersonObject)
proxy1.myFunction(ComputerObject)

我的限制是应该只有一个操作合同暴露给客户。

如何设计一个可以将 25 个 DataContract 类中的任何一个作为参数的 Web 方法?我尝试使用object参数类型并将KnownType属性赋予 DataContract 类,但在序列化过程中我没有运气。

4

2 回答 2

8

我刚刚做了这个,我发现你需要在界面中添加 KnownTypesAttribute。

[ServiceContract]
[ServiceKnownType(typeof(MyContract1)]
[ServiceKnownType(typeof(MyContract2)]
[ServiceKnownType(typeof(MyContract3)]
public interface IMyService
{
    [OperationContract]
    object TakeMessage();

    [OperationContract]
    void AddMessage(object contract);

}

在您的实现中,您需要检查类型以确保它是您的 DataContract 之一。

编辑

如果你有很多合约,你可以使用反射将它们添加到 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;
    }
}

然后你可以将你的接口声明为,

[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))]
public interface IMyService
{
    [OperationContract]
    object TakeMessage( );

    [OperationContract]
    void AddMessage(object contract);
}

这是一种更清洁的方式。

于 2012-04-12T06:34:35.427 回答
1

你可以尝试的一件事是,创建一个像 IObj 这样的接口,并为 25 个不同的数据合约对象实现这个接口。然后对于你的操作合约,让参数类型为 IObj。这将帮助您发送 25 个参数。

于 2012-04-12T06:38:28.773 回答