2011-06-23 44 views
0

想用自定義替換wcf serializer。 012,谷歌搜索後,我找到了一些例子。但它不起作用。 這裏是我的代碼: Substitutor:WCF自定義串行器不工作

internal class MySerializerSubstitutor : DataContractSerializerOperationBehavior 
    { 
     private static readonly MySerializer _serializer = new MySerializer(); 
     public MySerializerSubstitutor (OperationDescription operationDescription) 
      : base(operationDescription) 
     { 

     } 

     public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes) 
     { 
      return _serializer; //NEVER CALLED 
     } 

     public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes) 
     { 
      return _serializer; // NEVER CALLED 
     } 
    } 

行爲,repolace串行

public class MySerializerBehavior : IOperationBehavior 
{ 

.......

public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch) 
    { 
     var dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 

     if (dcs != null) 
      description.Behaviors.Remove(dcs); 

     description.Behaviors.Add(new MySerializerSubstitutor(description)); //works fine 
    } 

......... ...

} 

和主機:

protected override void ApplyConfiguration() 
{ 
var behavior = new MySerializerBehavior() 
       foreach (var op in Description.Endpoints.SelectMany(ep => ep.Contract.Operations)) 
       { 
        op.Behaviors.Add(behavior); 
       } 
} 

這段代碼有什麼問題?

+0

ApplyConfiguration是否被調用?另外,您應該在ApplyDispatchBehavior之前刪除原始的DataContractSerializerOperationBehavior - 此時它可能已經被調用,因此它已經添加了它的運行時段,並且您將不會有機會這樣做。 – carlosfigueira

回答

2

立即可見的一個問題是,您無法從行爲中替換行爲。根據MSDN:

所有IOperationBehavior方法都將OperationDescription 對象作爲參數傳遞。該參數僅供檢查;如果您修改OperationDescription對象 的執行行爲是未定義的 。

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior.aspx

我不是100%肯定你想什麼來完成,但這裏是修改串行行爲的性質的例子。

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx

如果你需要更多的定製比屬性提供您可以嘗試更換DataContractSerializerOperationBehavior。編輯:只要確保在調用Open之前添加它。請參閱此文章以添加新行爲http://msdn.microsoft.com/en-us/library/ms730137.aspx