在某些场合中,我们需要提供以object为参数的方法。不过在WCF中,由于需要序列化与反序列化,因此它要求所有WCF传递的参数类型都是已知的,无法传递object这种未知类型。即使用了KnownType来标记自定义对象,也无法调用。以下代码无法正常执行:
    [DataContract]
    public class Product
    {
        [DataMember]
        public string Name;
    }

[ServiceContract]
    public interface IProductInfo
    {
        [OperationContract]
        string GetProductTypeName(Object obj);
    }

[KnownType(typeof(Product))]
    public class ProductInfo : IProductInfo
    {
         public string GetProductTypeName(Object obj)
         {
               return obj.ToString();
         }
     }

调用时:
      ProductInfoClient client = new ProductInfoClient ();
      client.GetProductTypeName("传字符串类型,调用成功");
      client.GetProductTypeName(new Product()); //报错

不过,可以通过定义一个中间类型来传递object对象。方法就是在这个类型中包含一个object的成员,并且定义该成员为KnownType。代码如下:

[DataContract]
    [KnownType(typeof(Product))] //必须标记Product类型
    public class RequestData
    {
        [DataMember]
        public object RequestObject;
    }

通过传递RequestData,就能变相实现object对象的传递。

[ServiceContract]
    public interface IProductInfo
    {
        [OperationContract]
        string GetProductTypeName(RequestData requestData);
    }

public class ProductInfo : IProductInfo
    {
         public string GetProductTypeName(RequestData requestData)
         {
               return requestData.RequestObject.ToString();
         }
     }

不过,你会发现任何自定义对象都必须在RequestData中预先设定为KnownType,否则WCF无法序列化。这显然还不够灵活。为了让方法可以方便的调用,而不需要担心是否标记了KnownType,我们可以通过定义一个方法并把这个方法名作为KnownType参数来解决此问题。这里用到KnownType的另一个重载方法:
      KnownTypeAttribute(string methodName);
     这个方法必须满足以下条件:
     a 必须是static,因为需要在对象实例化之前调用。
     b 必须是不带任何参数的。
     C 返回类型必须是可被IEnumerable接受的,(也就是实现了IEnumerable接口的)。

改造后RequestData如下:

[DataContract]
    [KnownType("GetKnownType")]
    public class RequestData
    {
        //增加构造函数方便使用
        public RequestData(object requestObj)
        {
                 RequestObject = requestObj;
         }
        [DataMember]
        public object RequestObject;

        private static Type[] GetKnownType()
        {
            //将自定义对象的程序集下的所有类型标记为KnownType。
            return Assembly.Load("DataEntityAssemblyName").GetTypes();
        }
    }

在GetKnownType函数中,程序将自定义类型的程序集包含的类型全部返回,这下就省事多了。。

转载于:https://www.cnblogs.com/guanshan/p/guan041.html

解决WCF接口无法传递object参数的问题相关推荐

  1. 接口返回[object,Object]解决方法

    接口返回[object,Object]解决方法 参考文章: (1)接口返回[object,Object]解决方法 (2)https://www.cnblogs.com/kaiqinzhang/p/10 ...

  2. 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))

    学习大数据的第13天--Java面向对象(接口.分析参数返回值的类型不同时如何解决.包以及访问权限修饰符(public.protected.默认.private)) 接口 接口的基本定义: 1.1.语 ...

  3. C#动态调用WCF接口,两种方式任你选。

    REFERENCE FROM : http://www.cnblogs.com/Leo_wl/p/4762784.html 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触 ...

  4. 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?

    本文分享自华为云社区<如何解决异步接口请求快慢不均导致的数据错误问题?>,原文作者:Kagol . 引言 搜索功能,我想很多业务都会涉及,这个功能的特点是: 用户可以在输入框中输入一个关键 ...

  5. JAVA学习笔记第八天——接口作为方法参数和返回值、多态、内部类

    一.回顾: 权限修饰符: public -> protected -> (default) ->private 重写: 1.方法名和参数列表一致 2.子类中重写的方法, 返回值类型[ ...

  6. 接口快速复制到 Postman 接口快速修改参数调试

    文章目录 接口快速复制到 Postman && 接口快速修改参数调试 前言 背景 此文章可以解决什么问题 如何使用 接口快速复制到 Postman 采用 Console 快速调试 使用 ...

  7. WCF接口的COM调用

    服务接口往往会被跨平台.跨技术调用.使用非.NET技术(如asp, vb6)调用WCF服务接口时只能使用COM方式,通常有三种方法 1.使用SOAP SDK中的Soap对象 2.使用HTTPReque ...

  8. Java 类和对象——抽象类、接口、Object类

    本文章继续来介绍类和对象的知识.重点介绍抽象类和接口,Object类只做简单介绍. 现在,定义一个Shape类(形状类),当不同的对象去调用的时候,就会画出不同的图形,使用圆这个对象去调用,就会画出⚪ ...

  9. Postman测试WCF接口

    1.设置请求post地址 请求url地址为svc地址 2.设置header 1)Content-Type设为text/xml 2)添加请求接口的方法soapAction,可以从http://ip:74 ...

最新文章

  1. mongodb拆库分表脚本
  2. BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
  3. jQuery对象的序列化详解
  4. 679. 24 Game 24 点游戏
  5. js中的prototype的理解
  6. 从JDK 6升级到JDK 7过程中遇到的一个问题(卸载rpm)
  7. 张小娴的文章,喜欢的,贴来存档
  8. java中取系统时间_JAVA中获取当前系统时间(示例代码)
  9. int 转为字节后 低字节在前_NumPy 字节交换
  10. python中装饰器的作用_Python中装饰器的用法
  11. [转载] Python导出Excel图表
  12. Python 命令行库的大乱斗 | 凌云时刻
  13. 卸载mySQL数据库
  14. Ubuntu下利用python实现自动打卡系统全过程
  15. 计算机配置显示器,电脑怎么配置多台显示器
  16. Java观察者模式例子
  17. 从企业版BOSS直聘,看求职简历技巧
  18. Android中使用webview加载网页上的按钮点击失效
  19. QQ交谈小图标代码html,仿qq聊天工具设计源码及说明
  20. 配置 CRM2011 IFD

热门文章

  1. CF1142C U2(计算几何,凸包)
  2. LeetCode 258 Add Digits
  3. python3.6安装【scrapy】-最保守方法
  4. Mvc5 控制器,视图简单说明
  5. 【2016.11.17】HTML学习笔记第二天
  6. 欧拉函数 cojs 2181. 打表
  7. $Android连续按返回键两次实现退出程序
  8. HADOOP__PIG安装与配置
  9. 全面搞定jive3.1.1
  10. .NET Core Docker使用初入篇