在某些场合中,我们需要提供以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. luogu4917天守阁的地板

    https://www.zybuluo.com/ysner/note/1317548--- 题面 给出\(n\),用所有长为\(a\).宽为\(b\)\((1\leq a,b\leq n)\)的长方形 ...

  2. hdu5410(完全背包变形)

    这是道完全背包,关键点在于如何处理每种物品,第一次放时,价值为A+B,以后放时,价值为A. 所以有三种决策,对于第i种物品,要么不放,要么是作为第一个放,要么是第二个以后放. 作为第一个放时,需要用到 ...

  3. ubuntu中desktop与alternate版本的区别(转载)

    转自:http://www.hyleong.com/ubuntu-desktop-alternate/ 今天ubuntu发布了11.04版本,但是下载的时候有desktop和alternate版本,他 ...

  4. python 面向对象四 继承和多态

    一.继承 class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(s ...

  5. P2210 Haywire(A*)

    P2210 Haywire 题目描述 Farmer John有N只奶牛,(4 <= N <= 12,其中N是偶数). 他们建立了一套原生的系统,使得奶牛与他的朋友可以通过由干草保护的线路来 ...

  6. 洛谷P3569 [POI2014]KAR-Cards(线段树)

    传送门 蠢了…… 我们用线段树,记$w0$为该区间最左端取小值时,最右端最小能取大还是小还是无解,$w1$表示最左端取大值时,最右端最小能取大还是小还是无解 然后只要把交换看做修改就好了 这么说可能很 ...

  7. Luogu P1113 杂务 【拓扑排序】 By cellur925

    题目传送门 这题我们一看就知道是拓扑排序,然而在如何转化问题上花了大工夫,一个小时后最后还是无奈看了题解qwq. 显然我们可以对于每个任务,从他的前导任务到他连一条边,最后我们可以得到一个DAG.在这 ...

  8. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...

  9. UTF-8格式的文本文件程序读取异常

    最近在windows服务器上直接创建并手打输入配置参数,比如设置概率0.6,然后用java程序打开读取该参数,在本地linux环境下测试完全正常,但是一放到服务器上,就报NotNumber错误,查看了 ...

  10. Oracle10g安装过程中ORA-27125问题解决

    Oracle10g在CentOS7的安装过程中报错如下错误信息: ORA-: unable to create shared memory segment 解决办法: [root@dbsrv3 dat ...