WCF OperationContract具有松散类型的参数

时间:2012-04-12 06:30:21

标签: c# wcf operationcontract

我想在我的网络方法中输入一个松散的参数。

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

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

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

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

2 个答案:

答案 0 :(得分:8)

我刚刚完成了这个,我发现你需要将KnownTypesAttribute添加到界面中。

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

然后您可以将您的界面声明为

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

    [OperationContract]
    void AddMessage(object contract);
}

这是一种更清洁的方式。

答案 1 :(得分:1)

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