82 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
#if FEAT_SERVICEMODEL && PLAT_XMLSERIALIZER
 | 
						|
using System.ServiceModel.Description;
 | 
						|
 | 
						|
namespace ProtoBuf.ServiceModel
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Behavior to swap out DatatContractSerilaizer with the XmlProtoSerializer for a given endpoint.
 | 
						|
    ///  <example>
 | 
						|
    /// Add the following to the server and client app.config in the system.serviceModel section:
 | 
						|
    ///  <behaviors>
 | 
						|
    ///    <endpointBehaviors>
 | 
						|
    ///      <behavior name="ProtoBufBehaviorConfig">
 | 
						|
    ///        <ProtoBufSerialization/>
 | 
						|
    ///      </behavior>
 | 
						|
    ///    </endpointBehaviors>
 | 
						|
    ///  </behaviors>
 | 
						|
    ///  <extensions>
 | 
						|
    ///    <behaviorExtensions>
 | 
						|
    ///      <add name="ProtoBufSerialization" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.255, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
 | 
						|
    ///    </behaviorExtensions>
 | 
						|
    ///  </extensions>
 | 
						|
    /// 
 | 
						|
    /// Configure your endpoints to have a behaviorConfiguration as follows:
 | 
						|
    /// 
 | 
						|
    ///  <service name="TK.Framework.Samples.ServiceModel.Contract.SampleService">
 | 
						|
    ///    <endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding" behaviorConfiguration="ProtoBufBehaviorConfig"
 | 
						|
    ///     bindingConfiguration="basicHttpBindingConfig" name="basicHttpProtoBuf" contract="ISampleServiceContract" />
 | 
						|
    ///  </service>
 | 
						|
    ///  <client>
 | 
						|
    ///      <endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding"
 | 
						|
    ///          bindingConfiguration="basicHttpBindingConfig" contract="ISampleServiceContract"
 | 
						|
    ///          name="BasicHttpProtoBufEndpoint" behaviorConfiguration="ProtoBufBehaviorConfig"/>
 | 
						|
    ///   </client>
 | 
						|
    /// </example>
 | 
						|
    /// </summary>
 | 
						|
    public class ProtoEndpointBehavior : IEndpointBehavior
 | 
						|
    {
 | 
						|
        #region IEndpointBehavior Members
 | 
						|
 | 
						|
        void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
 | 
						|
        {
 | 
						|
            ReplaceDataContractSerializerOperationBehavior(endpoint);
 | 
						|
        }
 | 
						|
 | 
						|
        void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
 | 
						|
        {
 | 
						|
            ReplaceDataContractSerializerOperationBehavior(endpoint);
 | 
						|
        }
 | 
						|
 | 
						|
        void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        private static void ReplaceDataContractSerializerOperationBehavior(ServiceEndpoint serviceEndpoint)
 | 
						|
        {
 | 
						|
            foreach (OperationDescription operationDescription in serviceEndpoint.Contract.Operations)
 | 
						|
            {
 | 
						|
                ReplaceDataContractSerializerOperationBehavior(operationDescription);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
 | 
						|
        {
 | 
						|
            DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
 | 
						|
            if (dcsOperationBehavior != null)
 | 
						|
            {
 | 
						|
                description.Behaviors.Remove(dcsOperationBehavior);
 | 
						|
 | 
						|
                ProtoOperationBehavior newBehavior = new ProtoOperationBehavior(description);
 | 
						|
                newBehavior.MaxItemsInObjectGraph = dcsOperationBehavior.MaxItemsInObjectGraph;
 | 
						|
                description.Behaviors.Add(newBehavior);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif |