mirror of https://github.com/quasar/Quasar.git
86 lines
3.5 KiB
C#
86 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 |