解决WCF接口无法传递object参数的问题
在某些场合中,我们需要提供以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参数的问题相关推荐
- 接口返回[object,Object]解决方法
接口返回[object,Object]解决方法 参考文章: (1)接口返回[object,Object]解决方法 (2)https://www.cnblogs.com/kaiqinzhang/p/10 ...
- 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))
学习大数据的第13天--Java面向对象(接口.分析参数返回值的类型不同时如何解决.包以及访问权限修饰符(public.protected.默认.private)) 接口 接口的基本定义: 1.1.语 ...
- C#动态调用WCF接口,两种方式任你选。
REFERENCE FROM : http://www.cnblogs.com/Leo_wl/p/4762784.html 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触 ...
- 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?
本文分享自华为云社区<如何解决异步接口请求快慢不均导致的数据错误问题?>,原文作者:Kagol . 引言 搜索功能,我想很多业务都会涉及,这个功能的特点是: 用户可以在输入框中输入一个关键 ...
- JAVA学习笔记第八天——接口作为方法参数和返回值、多态、内部类
一.回顾: 权限修饰符: public -> protected -> (default) ->private 重写: 1.方法名和参数列表一致 2.子类中重写的方法, 返回值类型[ ...
- 接口快速复制到 Postman 接口快速修改参数调试
文章目录 接口快速复制到 Postman && 接口快速修改参数调试 前言 背景 此文章可以解决什么问题 如何使用 接口快速复制到 Postman 采用 Console 快速调试 使用 ...
- WCF接口的COM调用
服务接口往往会被跨平台.跨技术调用.使用非.NET技术(如asp, vb6)调用WCF服务接口时只能使用COM方式,通常有三种方法 1.使用SOAP SDK中的Soap对象 2.使用HTTPReque ...
- Java 类和对象——抽象类、接口、Object类
本文章继续来介绍类和对象的知识.重点介绍抽象类和接口,Object类只做简单介绍. 现在,定义一个Shape类(形状类),当不同的对象去调用的时候,就会画出不同的图形,使用圆这个对象去调用,就会画出⚪ ...
- Postman测试WCF接口
1.设置请求post地址 请求url地址为svc地址 2.设置header 1)Content-Type设为text/xml 2)添加请求接口的方法soapAction,可以从http://ip:74 ...
最新文章
- mongodb拆库分表脚本
- BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
- jQuery对象的序列化详解
- 679. 24 Game 24 点游戏
- js中的prototype的理解
- 从JDK 6升级到JDK 7过程中遇到的一个问题(卸载rpm)
- 张小娴的文章,喜欢的,贴来存档
- java中取系统时间_JAVA中获取当前系统时间(示例代码)
- int 转为字节后 低字节在前_NumPy 字节交换
- python中装饰器的作用_Python中装饰器的用法
- [转载] Python导出Excel图表
- Python 命令行库的大乱斗 | 凌云时刻
- 卸载mySQL数据库
- Ubuntu下利用python实现自动打卡系统全过程
- 计算机配置显示器,电脑怎么配置多台显示器
- Java观察者模式例子
- 从企业版BOSS直聘,看求职简历技巧
- Android中使用webview加载网页上的按钮点击失效
- QQ交谈小图标代码html,仿qq聊天工具设计源码及说明
- 配置 CRM2011 IFD