OperationInvoker ile Tüm Operasyonları İzleme

by Timur 1. Aralık 2011 16:21

Merhaba.

Bugün OperationInvoker'dan biraz bahsedeceğim. WCF'de IOperationInvoker'dan türetme yolu ile yeni Invoker yaratabilir, WCF servis tarafında istediğimiz operasyonların çalışmalarını istediğimiz gibi yönlendirebiliriz. Örneğin bir OperatıonInvoker yazarak istediğimiz bir kontrolü yapabiliriz. WCF servisimizde çalışan tüm operasyonları loglamak istemez miyiz?

 

Bunun için bir OperatinBehaviour yazarak ilgili operasyonun Invoker sınıfına kendi oluşturduğumuz sınıfı atıyoruz.

public class ExceptionOperationBehavior : Attribute, IOperationBehavior

{

	public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)

	{

		

	}



	public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)

	{

		

	}



	public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)

	{

		IOperationInvoker invoker = dispatchOperation.Invoker;

		dispatchOperation.Invoker = new ExceptionOperationInvoker(invoker, operationDescription.Name);

	}



	public void Validate(OperationDescription operationDescription)

	{

		

	}

}

 

Kendi oluşturduğumuz sınıfımız ise methodun kendi Invoker'ını çalıştıracak, fakat bu çalıştırma öncesinde ve sonrasında gerekli loglamaları yapacaktır.

 

public class ExceptionOperationInvoker : IOperationInvoker

{

	#region Members

	IOperationInvoker _Invoker = null;

	string _Name = string.Empty;

	#endregion



	#region Properties

	public bool IsSynchronous

	{

		get { return _Invoker.IsSynchronous; }

	}

	#endregion



	#region Initialization

	public ExceptionOperationInvoker(IOperationInvoker invoker, string name)

	{

		_Invoker = invoker;

		_Name = name;

	}

	#endregion



	#region Methods

	public object[] AllocateInputs()

	{

		return _Invoker.AllocateInputs();

	}



	public object Invoke(object instance, object[] inputs, out object[] outputs)

	{

		string userName = string.Empty;

		if (OperationContext.Current != null)

		{

			if (ServerManager.Instance.Connecteds.Contains(OperationContext.Current.SessionId))

			{

				userName = ServerManager.Instance.Connecteds[OperationContext.Current.SessionId].Username;

			}

		}

		try

		{

			object obj = _Invoker.Invoke(instance, inputs, out outputs);

			LogEntry entry = new LogEntry(userName, _Name + " operation completed successfully", DateTime.Now, LogEntryType.Information);

			ServerManager.Instance.LogManager.Add(entry);

			return obj;

		}

		catch (Exception exp)

		{

			ServerManager.Instance.LogManager.Add(exp, userName);

			throw new FaultException(new FaultReason(exp.Message));

		}

	}



	public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)

	{

		return _Invoker.InvokeBegin(instance, inputs, callback, state);

	}



	public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)

	{

		return _Invoker.InvokeEnd(instance, out outputs, result);

	}

	#endregion



}

 

Eğer bunu WCF'te çalışan tüm operasyonlar için yapmak istiyorsak da, yapacağımız bir ServiceBehaviour yazarak servis ayağa kalktığında tüm operasyonlar için gerçekleştirmektir.

public class ExceptionServiceBehavior : Attribute, IServiceBehavior

{

	public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)

	{

		

	}



	public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)

	{

		foreach (ServiceEndpoint endPoint in serviceDescription.Endpoints)

		{

			foreach (OperationDescription description in endPoint.Contract.Operations)

			{

				description.Behaviors.Add(new ExceptionOperationBehavior());

			}

		}

	}



	public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)

	{

		return;

	}

}

 

Servisimize de Attribute olarak eklediğimizde işlem tamam demektir...

[ExceptionServiceBehavior]

public class SosGame : ISosGame

{

}

 

Hoşçakalın...

Tags: , , ,

Yorum ekle

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading

Hakkımda

Evli, mutlu, çocuksuz...

Bilgisayar Mühendisi...

.Net Developer...

Crs Soft