WCF中的Dynamic ExpandoObject

编程入门 行业动态 更新时间:2024-10-11 15:17:41
本文介绍了WCF中的Dynamic ExpandoObject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

[ServiceContract(CallbackContract = typeof(iStackoverflowCallBack))] public interface iStackoverflow { [OperationContract] void Ping(进程操作,动态数据); } [ServiceContract()] public interface iStackoverflowCallBack { [OperationContract] void Pong(进程操作,动态数据) ; }

为什么此服务连接有问题?

  • 当实现两个界面动态自动转换为对象。
  • 当从消费者那里获取我的服务 ping 时,ping根本没有达到服务但是服务正常工作。

解决方案:

[DataContract] public class SerializableDynamicObject:IDynamicMetaObjectProvider { [DataMember] private IDictionary< string,object> dynamicProperties = new Dictionary< string,object>(); #region IDynamicMetaObjectProvider实现 public DynamicMetaObject GetMetaObject(Expression expression) { return new SerializableDynamicMetaObject(expression, BindingRestrictions.GetInstanceRestriction(expression,this) , 这个); } #endregion #region动态元对象支持的助手方法内部对象setValue(字符串名称,对象值) { dynamicProperties.Add(name,value); 返回值; } 内部对象getValue(string name) {对象值; if(!dynamicProperties.TryGetValue(name,out value)){ value = null; } 返回值; } 内部IEnumerable< string> getDynamicMemberNames() { return dynamicProperties.Keys; } #endregion } public class SerializableDynamicMetaObject:DynamicMetaObject { Type objType; public SerializableDynamicMetaObject(表达式表达式,BindingRestrictions限制,对象值):base(表达式,限制,值) { objType = value.GetType(); } public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { var self = this.Expression; var dynObj =(SerializableDynamicObject)this.Value; var keyExpr = Expression.Constant(binder.Name); var getMethod = objType.GetMethod(getValue,BindingFlags.NonPublic | BindingFlags.Instance); var target = Expression.Call(Expression.Convert(self,objType), getMethod, keyExpr); 返回新的DynamicMetaObject(target, BindingRestrictions.GetTypeRestriction(self,objType)); } public override DynamicMetaObject BindSetMember(SetMemberBinder binder,DynamicMetaObject value) { var self = this.Expression; var keyExpr = Expression.Constant(binder.Name); var valueExpr = Expression.Convert(value.Expression,typeof(object)); var setMethod = objType.GetMethod(setValue,BindingFlags.NonPublic | BindingFlags.Instance); var target = Expression.Call(Expression.Convert(self,objType), setMethod, keyExpr, valueExpr); 返回新的DynamicMetaObject(target, BindingRestrictions.GetTypeRestriction(self,objType)); } public override IEnumerable< string> GetDynamicMemberNames() { var dynObj =(SerializableDynamicObject)this.Value; return dynObj.getDynamicMemberNames(); } }

解决方案

任何WCF操作合同的参数必须是WCF数据合约(或原始类型),否则数据将不会被序列化和传输。

msdn.microsoft/en-us/library/ms733127.aspx

Trying to Ping / Pong my service with an operation of enum type process and dynamic data.

[ServiceContract ( CallbackContract = typeof ( iStackoverflowCallBack ) )] public interface iStackoverflow { [OperationContract] void Ping ( Process Operation , dynamic Data ); } [ServiceContract ( )] public interface iStackoverflowCallBack { [OperationContract] void Pong ( Process Operation , dynamic Data ); }

Why this service having issues connecting ?

  • When implementing both interfaces dynamic converted automatically to object.
  • When pinging my service from consumer, the ping doesn't reach the service at all but the service is working properly.

Solution :

[DataContract] public class SerializableDynamicObject : IDynamicMetaObjectProvider { [DataMember] private IDictionary<string,object> dynamicProperties = new Dictionary<string,object>(); #region IDynamicMetaObjectProvider implementation public DynamicMetaObject GetMetaObject (Expression expression) { return new SerializableDynamicMetaObject(expression, BindingRestrictions.GetInstanceRestriction(expression, this), this); } #endregion #region Helper methods for dynamic meta object support internal object setValue(string name, object value) { dynamicProperties.Add(name, value); return value; } internal object getValue(string name) { object value; if(!dynamicProperties.TryGetValue(name, out value)) { value = null; } return value; } internal IEnumerable<string> getDynamicMemberNames() { return dynamicProperties.Keys; } #endregion } public class SerializableDynamicMetaObject : DynamicMetaObject { Type objType; public SerializableDynamicMetaObject(Expression expression, BindingRestrictions restrictions, object value) : base(expression, restrictions, value) { objType = value.GetType(); } public override DynamicMetaObject BindGetMember (GetMemberBinder binder) { var self = this.Expression; var dynObj = (SerializableDynamicObject)this.Value; var keyExpr = Expression.Constant(binder.Name); var getMethod = objType.GetMethod("getValue", BindingFlags.NonPublic | BindingFlags.Instance); var target = Expression.Call(Expression.Convert(self, objType), getMethod, keyExpr); return new DynamicMetaObject(target, BindingRestrictions.GetTypeRestriction(self, objType)); } public override DynamicMetaObject BindSetMember (SetMemberBinder binder, DynamicMetaObject value) { var self = this.Expression; var keyExpr = Expression.Constant(binder.Name); var valueExpr = Expression.Convert(value.Expression, typeof(object)); var setMethod = objType.GetMethod("setValue", BindingFlags.NonPublic | BindingFlags.Instance); var target = Expression.Call(Expression.Convert(self, objType), setMethod, keyExpr, valueExpr); return new DynamicMetaObject(target, BindingRestrictions.GetTypeRestriction(self, objType)); } public override IEnumerable<string> GetDynamicMemberNames () { var dynObj = (SerializableDynamicObject)this.Value; return dynObj.getDynamicMemberNames(); } }

解决方案

The arguments for any WCF Operation Contract must be WCF Data Contract (or primitive types) or else the data will not be serialized and transferred.

msdn.microsoft/en-us/library/ms733127.aspx

更多推荐

WCF中的Dynamic ExpandoObject

本文发布于:2023-11-28 17:40:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1643346.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:WCF   Dynamic   ExpandoObject

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!