首页 文章

WCF OperationContract具有松散类型的参数

提问于
浏览
4

我想在我的Web方法中使用松散类型的参数 .

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

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

我的限制是应该只有一个操作 Contract 暴露给客户 .

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

2 回答

  • 1

    我刚刚完成了这个,我发现你需要将KnownTypesAttribute添加到接口 .

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

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

    EDIT

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

    这是一种更清洁的方式 .

  • 8

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

相关问题