Как запустить событие (на стороне клиента), когда я вызываю службу WCF - PullRequest
5 голосов
/ 24 марта 2011

Я хотел бы запускать событие каждый раз, когда вызываю службу WCF.

Я пробовал следующее:

var factory = new ChannelFactory<TService>(binding, endPointAdress);

factory.Credentials.UserName.UserName = username;
factory.Credentials.UserName.Password = password;

var proxy = factory.CreateChannel();

((IContextChannel)this.Proxy).Opened += new EventHandler(FactoryOpeningEventHandler);
this.Factory.Opened += new EventHandler(FactoryOpeningEventHandler);

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

1 Ответ

6 голосов
/ 24 марта 2011

Вы начинаете с создания класса инспектора, который реализует интерфейсы IDispatchMessageInspector (при отправке) и IClientMessageInspector (при получении).

public class SendReceiveInspector : IDispatchMessageInspector, IClientMessageInspector
{

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        // TODO: Fire your event here if needed
        return null;
    }
    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        // TODO: Fire your event here if needed
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        // TODO: Fire your event here if needed
    }

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        // TODO: Fire your event here if needed
        return null;
    }
}

После того, как у вас есть класс инспектора, вы должны зарегистрировать его с помощью поведения.

public class SendReceiveBehavior : IEndpointBehavior, IServiceBehavior
{
    void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new SendReceiveInspector());
    }

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new SendReceiveInspector());
    }

    void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
        // Leave empty
    }

    void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
    {
        // Leave empty
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription desc, ServiceHostBase host)
    {
        foreach (ChannelDispatcher cDispatcher in host.ChannelDispatchers)
        {
            foreach (EndpointDispatcher eDispatcher in cDispatcher.Endpoints)
            {
                eDispatcher.DispatchRuntime.MessageInspectors.Add(new SendReceiveInspector());
            }
        }
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
        // Leave empty
    }

    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        // Leave empty
    }
}

Наконец, вы должны зарегистрировать это поведение в описании вашей услуги:

host.Description.Behaviors.Add(new SendReceiveBehavior ());
foreach (ServiceEndpoint se in host.Description.Endpoints)
    se.Behaviors.Add(new SendReceiveBehavior ());

Подробнее о расширении WCF можно узнать по адресу http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

...