Существуют и другие альтернативы созданию еще одного сервиса только для регистрации.Вы можете построить протоколирование в качестве аспекта и прикрепить / отсоединить этот аспект (он же инжектировать), как и когда это требуется любым ServiceContract
или OperationContract
.Таким образом, вы отделяете протоколирование, но это позволяет избежать дополнительных затрат на вызов еще одной службы при каждом вызове.После того как вы создадите эти аспекты, скомпилируйте их в отдельный двоичный файл и используйте их по мере необходимости во всех ваших будущих службах. Включение и отключение определенных сценариев ведения журналов более приемлемо для IMO по сравнению с выделенной службой только для ведения журналов.
Посмотрите на следующие два поста, и они предоставляют упрощенный подход к выполнению этого, вам нужно будет заполнить плоть, как вы хотите для своего проекта.
Важная документация MSDN, которую вы хотели бы просмотреть.
Редактировать - Пример кода
С приведенным ниже кодом вы добавляете [OperationLogging]
над любым вашим договором на эксплуатацию, и вы можете перехватывать вызовы к этому договору на операции в LoggingInspector.BeforeCall
.
Использование [ServiceLogging]
в любом договоре на обслуживаниеа такжевсе операции, определенные в этих вызовах службы, могут быть перехвачены и зарегистрированы.
Установите для your_app_config_key
значение, отличное от TRUE
, эти дополнительные действия не добавляются в ваш конвейер службы.Это очень круто, поскольку ни один из этого кода не выполняется на основе этого ключа в конфигурации.
public class LoggingInspector : IParameterInspector
{
private string service;
public LoggingInspector(string serviceName){ service = serviceName;}
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState){}
public object BeforeCall(string operationName, object[] inputs)
{
// your logging logic
}
}
//Operation Logging attribute - applied to operationcontracts.
[AttributeUsage(AttributeTargets.Method)]
public class OperationLoggingAttribute : Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters){}
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation){}
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
if (ConfigurationManager.AppSettings["your_app_config_key"] == "TRUE")
dispatchOperation.ParameterInspectors.Add(new LoggingInspector(dispatchOperation.Parent.Type.Name));
}
public void Validate(OperationDescription operationDescription){}
}
//Service Loggign attribute - applied to Service contract
[AttributeUsage(AttributeTargets.Class)]
public class ServiceLoggingAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters){}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
if (ConfigurationManager.AppSettings["your_app_config_key"] == "TRUE")
foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints)
foreach (OperationDescription operation in endpoint.Contract.Operations)
operation.Behaviors.Add(new OperationLoggingAttribute());
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase){}
}