解决WCF接口无法传递object参数的问题
来源:互联网 发布:淘宝企业店铺权重高吗 编辑:程序博客网 时间:2024/04/30 00:06
在某些场合中,我们需要提供以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参数的问题
- 解决WCF接口无法传递object参数的问题
- 解决WCF接口无法传递object参数的问题
- C#解决EventHandler参数无法传递问题
- 关于安卓调用wcf传递复杂参数的问题
- 一行代码解决百度分享无法动态传递参数问题
- 解决axios传递参数后台无法接收问题
- Struts2 使用拦截器后参数无法传递问题的解决
- 如何解决网页的参数传递问题
- 解决JSP参数传递乱码的问题
- 解决JSP参数传递乱码的问题
- 解决jsp参数传递乱码的问题
- 解决jsp参数传递乱码的问题
- 解决jsp参数传递乱码的问题
- 解决jsp参数传递乱码的问题
- 解决jsp参数传递乱码的问题
- 如何解决JavaScript中UUID作为方法参数在方法中无法传递而数字却正常传递的问题
- 如何解决JavaScript中UUID作为方法参数在方法中无法传递而数字却正常传递的问题
- Ubuntu,TQ2440,arm-linux,Qt交叉编译环境配置
- 程序员是否必须会算法
- 再回首,数据结构——关于线索二叉树的点滴
- MVC大型商贸系统(库存管理)技术解释(二) 登陆
- PostgreSQL新手入门
- 解决WCF接口无法传递object参数的问题
- 再回首,数据结构——图的常用术语,邻接矩阵、邻接表存储结构
- intent-filter的data属性详述
- xcode中在LaunchImage里面放入图片运行后屏幕上下出现黑边
- C++语法拾遗
- android倒计时功能的实现(CountDownTimer)
- 【Android Studio(一)】从Eclipse迁移到Android Studio
- springmvc深入研究
- 铜山在逃犯罪人员信息记录查询