2012-07-15 35 views
4

尝试使用枚举类型进程和动态数据的操作来Ping/Pong我的服务。WCF中的Dynamic ExpandoObject

[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); 
} 

为什么有连接问题,这项服务?

  • 当执行这两个接口dynamic自动转换为object
  • ping从我的服务消费者,ping根本没有达到服务,但服务工作正常。

解决方案:

[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(); 
    } 
} 
+0

见http://loosexaml.wordpress.com/2011/01/01/wcf-serialization-of-dlr-dynamic-types/为Ahmend发布的代码的解释。 – rene 2014-04-07 09:39:06

回答

1

任何WCF经营合同的参数必须是WCF数据合同(或基本类型),否则数据不会被序列化和转移。

http://msdn.microsoft.com/en-us/library/ms733127.aspx

+0

那么如何发送KNOWN数据的UNKNOWN包? – 2012-07-15 12:06:12

+0

数据来自哪里?你能序列化成一个字符串吗?我通过一些快速搜索找到了这个。看看它是否适合你:https://loosexaml.wordpress.com/2011/01/01/wcf-serialization-of-dlr-dynamic-types/ – 2012-07-15 12:29:36