Как я могу расширить WCF в направлении обратного вызова? - PullRequest
2 голосов
/ 29 сентября 2011

Я могу присоединить IParameterInspector с использованием поведений к каждой операции в ClientRuntime, а также к каждой операции в DispatchRuntime на стороне службы. Но, похоже, это работает только от клиента к сервису.

Я также хочу иметь возможность подключить IParameterInspector в обратных вызовах от сервиса к клиенту по обеим сторонам провода, как указано выше, но я не могу найти какие-либо точки расширения для этого.

Есть идеи?

1 Ответ

3 голосов
/ 30 сентября 2011

Это немного неясно и, кажется, не так хорошо документировано, но вы можете настроить оба конца, используя стандартные возможности поведения 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 можно использовать для настройки каналов обратного вызова как на клиенте, так и на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...