2013-04-09 5 views
0

Наше приложение вызывает внешние услуги, такие какМожно ли отслеживать все исходящие вызовы WCF?

//in client factory 
FooServiceClient client = new FooServiceClient(binding, endpointAddress); 

//in application code 
client.BarMethod(); //or other methods 

Можно ли отслеживать все эти вызовы (например, события или что-то подобное), так что приложение может собирать статистические данные, как номер вызова, время отклика и т.д. ? Обратите внимание, что моему приложению необходимо получить доступ к значениям, а не только для записи в файл журнала.

Что я могу думать, чтобы создать подкласс VisualStudio сгенерированного FooServiceClient, а затем добавить коды, как этот

override void BarMethod() 
{ 
    RaiseStart("BarMethod"); 
    base.BarMethod(); 
    RaiseEnd("BarMethod); 
} 

и метод RaiseStart и RaiseEnd поднимет события, которые будут слушать мой код.

Но это кажется утомительным (потому что есть много способов переопределить), и есть много повторяющихся кодов, мой код должен меняться каждый раз, когда изменяется контракт на обслуживание, и т. Д. Есть ли более простой способ достичь этого, например, используя отражение для создания подкласса или путем использования встроенного метода в WCF, если таковые имеются?

ответ

0

Я нашел простой способ сделать это, используя динамический прокси-сервер, например Castle's Dynamic Proxy.

Во-первых, использовать фабричный метод для создания вашего объекта клиента

IFooClient GetClient() 
{   
    FooClient client = new FooClient(); //or new FooClient(binding, endpointAddress); if you want 
    ProxyGenerator pg = new ProxyGenerator(); 
    return pg.CreateInterfaceProxyWithTarget<IFoo>(client, new WcfCallInterceptor()); 
} 

И определить перехватчик

internal class WcfCallInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     try 
     { 
      RaiseStart(invocation.Method.Name); 
      invocation.Proceed(); 
     } 
     finally 
     { 
      RaiseEnd(invocation.Method.Name); 
     } 
    } 

    //you can define your implementation for RaiseStart and RaiseEnd 

} 

можно также изменить метод перехвата, как я хочу, например, я могу добавить блок catch для вызова другого обработчика в случае исключения метода throw и т. д.

2

Первое, на что я хотел бы обратить внимание, - проверить, могут ли счетчики, доступные на мониторе производительности вашего сервера, предоставить вам необходимую обратную связь. Там встроены счетчики для различных показателей для конечных точек ServiceModel, операций и служб. Вот еще одна информация http://msdn.microsoft.com/en-us/library/ms735098.aspx

2

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

Вы предоставляете реализацию IEndpointBehavior, которая применяет ваш инспектор сообщений, а затем добавляет поведение конечной точки в экземпляр вашего прокси-клиента.

client.Endpoint.Behaviors.Add(new MyEndpointBehavior()) 

Заканчивать документацию для MessageInspectors и EndpointBehaviors, есть много различных способов их (атрибуты, код, конечная точка XML конфигурация) применения, я не могу вспомнить из верхней части моей головы, которые относятся к которым, а также IServiceBehavior и IContractBehavior. Я точно знаю, что поведение конечной точки может быть добавлено в коллекцию прокси-сервера клиента.

+0

классный. Но кажется, что с IClientMessageInspector мы не можем получить ничего, если сообщение было остановлено, например из-за недоступного сервера. Вы знаете, как смотреть, когда такая ошибка происходит? –

+0

Я не уверен, если честно, если на сервере возникнут какие-либо ошибки при вызове операции, ответ будет получен клиентом, и вы можете поймать их в IClientMessageInspector.AfterReceiveReply, потому что сообщение будет иметь свойство IsFault true. Я не уверен, что вы все равно получите ответ, если клиент не сможет получить доступ к серверу. – Matt