Это немного неясно и, кажется, не так хорошо документировано, но вы можете настроить оба конца, используя стандартные возможности поведения WCF.
На клиенте этот атрибут может привести к этому.
public class InspectorBehaviorAttribute : Attribute, IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
foreach (var item in clientRuntime.CallbackDispatchRuntime.Operations)
{
item.ParameterInspectors.Add(ParameterInspector.Instance);
}
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Просто примените этот атрибут к классу, который реализует ваш интерфейс обратного вызова.
На сервере онстановится немного сложнее.Вам нужно подключиться через ApplyDispatchBehavior.В этом случае я сделал это с помощью служебного поведения, но принципал также применим к OperationBehaviors и EndpointBehaviors.
public class InspectorBehaviorAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var item in serviceHostBase.ChannelDispatchers.OfType<ChannelDispatcher>())
{
foreach (var ep in item.Endpoints)
{
foreach (var op in ep.DispatchRuntime.CallbackClientRuntime.Operations)
{
op.ParameterInspectors.Add(ParameterInspector.Instance);
}
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
Опять же, просто примените этот атрибут к реализации службы, чтобы инспектор параметров использовался для всех обратных вызовов.операции.
Хотя эти примеры демонстрируют подключение реализаций IParameterInspector, тот же подход для всех других точек расширения WCF можно использовать для настройки каналов обратного вызова как на клиенте, так и на сервере.