Подключение к конвейеру wcf - PullRequest
5 голосов
/ 17 декабря 2010

Есть ли способ проверить вызов метода wcf?Я имею в виду все, что равно HttpModule в asp.net.

Я хочу выполнить метод перед любым вызовом метода.

Ответы [ 3 ]

7 голосов
/ 17 декабря 2010

WCF имеет очень расширяемую архитектуру.Можно перехватывать и настраивать множество функций WCF, чтобы выполнять свои собственные задачи.

Для вашего случая вам придется написать соответствующий сервис или поведение конечной точки.Процесс между получением сообщения от транспортных каналов и вызовом вашего сервисного метода называется диспетчеризацией.WCF использует набор Поведений, чтобы выполнить диспетчеризацию.Вы можете предоставить свое собственное поведение для проверки вызовов методов.

В этой статье представлен превосходный обзор и примеры - http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

Я также хотел бы предложить вам пройти этот обзор архитектуры WCF http://msdn.microsoft.com/en-us/library/aa480210.aspx

0 голосов
/ 28 ноября 2016

Возможно, вы искали IOperationInvoker:

public class MyOperationInvoker : IOperationInvoker
{
    IOperationInvoker originalInvoker;
    public MyOperationInvoker(IOperationInvoker originalInvoker)
    {
        this.originalInvoker = originalInvoker;
    }

    public bool IsSynchronous { get { return originalInvoker.IsSynchronous; } }

    public object[] AllocateInputs() { return originalInvoker.AllocateInputs(); }

    public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        //Do stuff before call
        var res = this.originalInvoker.Invoke(instance, inputs, out outputs);
        //stuff after call
        return res;
    }

    public IAsyncResult InvokeBegin(object instance, object[] inputs,
                AsyncCallback callback, object state)
    {
        //Do stuff before async call
        var res = this.originalInvoker.InvokeBegin(instance, inputs, callback, state);
        return res;
    }

    public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
    {
        var res = this.InvokeEnd(instance, out outputs, result);
        //Do stuff after async call
        return res;
    }
}

Реализовано как атрибут для всех операций в службе:

public class MyBehaviorAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
    //IOperationBehavior
    public void ApplyDispatchBehavior(OperationDescription operationDescription,
            DispatchOperation dispatchOperation)
    {
        dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation.Invoker);
    }

    public void AddBindingParameters(OperationDescription operationDescription,
            BindingParameterCollection bindingParameters) { /*Do nothing*/ }

    public void ApplyClientBehavior(OperationDescription operationDescription,
            ClientOperation clientOperation) { /*Do nothing*/ }

    public void Validate(OperationDescription operationDescription) { /*Do nothing*/ }

    //IServiceBehavior
    public void Validate(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase) { /*Do nothing*/ }

    public void AddBindingParameters(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase,
                Collection<ServiceEndpoint> endpoints,
                BindingParameterCollection bindingParameters) { /*Do nothing*/ }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase)
    {
        foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                operation.Behaviors.Add(this);
            }
        }
    }

А сервис:

[MyBehavior]
public class HelloService : IHelloService
{
    ...
}
0 голосов
/ 17 декабря 2010

Зависит от того, что вы хотите проверить или изменить в сообщении, на каком уровне.Если вы хотите что-то изменить на уровне кодировки, вы можете выбрать Custom Message Encoder, если перед десериализацией запроса или перед отправкой ответа клиенту используйте инспектор пользовательских сообщений.

HTH.

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