2012-07-15 37 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