在某些场合中,我们需要提供以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函数中,程序将自定义类型的程序集包含的类型全部返回,这下就省事多了。。

解决WCF接口无法传递object参数的问题的更多相关文章

  1. a标签无法传递中文参数问题的解决

    a标签无法传递中文参数问题的解决. 可以通过form表单提交 隐藏域的方法解决. 前台jsp页面: <a class="vsb_buton" href="javas ...

  2. 解决WCF“接收对 http://xxx.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致"

    最近在工作中新加了一个接口,本地调试的时候,直接抛出“接收对 http://xxx.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中 ...

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

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  4. C#动态调用WCF接口

    C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项 ...

  5. WCF接口实例介绍

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. WCF整合了原有的windows通讯 ...

  6. 解决WCF传输的数据量过大问题

    今天写了个WCF接口,然后自测通过,和别人联调时报 远程服务器返回错误: (413) Request Entity Too Large        错误!记得以前写的时候也出现过这个错误,大致解决办 ...

  7. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  8. Web循环监控Java调用 / Java调用.net wcf接口

    背景介紹 (Background Introduction) 目前有一些报表客户抱怨打不开 报表执行过程过长,5.8.10秒甚至更多 不能及时发现和掌握服务器web站点情况 用戶需求(User Req ...

  9. C#微信公众号接口开发实例-高级接口-申请带参数的二维码

    最近公司涉及到微信绑定用户,做了高级接口-申请带参数的二维码,总结了下微信开发接口.微信接口开发都是除了消息用的xml 回复基本上都是用json的形式传递信息(post/get),开发的方法基本都是一 ...

随机推荐

  1. Linux 性能工具集

    系统级别: 下面这些工具利用内核的计数器在系统软硬件的环境中检查系统级别的活动. vmstat: 虚拟内存和物理内存的统计,系统级别. mpstat: 每个CPU 的 使用情况. iostat: 每个 ...

  2. Winpcap笔记3之打开适配器并捕获数据包

    上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const cha ...

  3. 堆与栈(JAVA)——以String str="abc"的深度含义解释

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的 ...

  4. cardboard sdk for unity 下载地址

    https://github.com/googlesamples/cardboard-unity

  5. ThinkPHP3.2.3学习笔记3---视图

    一.说明 每个模块的模板文件是独立的,为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录/[模板主题/]控制器名/操作名+模板后缀 默认的视图目录 ...

  6. vultr 购买vps

    基本安装转自:https://github.com/uxh/shadowsocks_bash/wiki/Vultr%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B 连接 Vul ...

  7. python网络爬虫之四简单爬取豆瓣图书项目

    一.爬虫项目一: 豆瓣图书网站图书的爬取: import requests import re content = requests.get("https://book.douban.com ...

  8. 题解报告:hdu 1230 火星A+B(字符串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230 Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要 ...

  9. 转 ORA-12638: 身份证明检索失败

    ORA-12638: 身份证明检索失败 的解决办法 2008年06月25日 星期三 11:42 the NTS option makes the Oracle client attempt to us ...

  10. Android插件开发

    插件开发的概念: 对于一个功能特别多,代码量特别大的App比如支付宝.360手机助手来说,如果把所有的功能和代码都写在一个App中,就会造成App体积过于庞大,用户下载体验差,不方便测试,业务.模块耦 ...