// // Source : http://chabster.blogspot.com/2008/02/wcf-cyclic-references-support.html // using System; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace Utils { public class CyclicReferencesAwareContractBehavior : IContractBehavior { private const Int32 MaxItemsInObjectGraph = 0xFFFFF; private const bool IgnoreExtensionDataObject = false; private readonly bool on; public CyclicReferencesAwareContractBehavior(bool on) { this.on = on; } #region IContractBehavior Members public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) { ReplaceDataContractSerializerOperationBehaviors(contractDescription, on); } public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) { ReplaceDataContractSerializerOperationBehaviors(contractDescription, on); } internal static void ReplaceDataContractSerializerOperationBehaviors(ContractDescription contractDescription, bool on) { foreach (var operation in contractDescription.Operations) { ReplaceDataContractSerializerOperationBehavior(operation, on); } } internal static void ReplaceDataContractSerializerOperationBehavior(OperationDescription operation, bool on) { if (operation.Behaviors.Remove(typeof(DataContractSerializerOperationBehavior)) || operation.Behaviors.Remove(typeof(ApplyCyclicDataContractSerializerOperationBehavior))) { operation.Behaviors.Add(new ApplyCyclicDataContractSerializerOperationBehavior(operation, MaxItemsInObjectGraph, IgnoreExtensionDataObject, on)); } } public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) { } #endregion } }