You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.5 KiB
85 lines
3.5 KiB
#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 |