還有其他方法可以爲記錄創建一個更多的服務。您可以根據任何ServiceContract
或OperationContract
的要求將日誌建立爲一個方面並附加/拆除此方面(又名注入)。通過這種方式可以將日誌記錄分離,但它避免了在每次調用時調用一個更多服務的開銷。一旦創建了這些方面,將它們編譯成單獨的二進制文件,並在需要時將它們用於所有未來的服務,啓用和禁用特定的日誌記錄方案與僅爲日誌記錄提供專用服務相比具有更好的可維護性。
看看下面的兩篇文章,他們提供了這樣簡單的方法,你必須填寫你想要的項目的肉體。
你想看看重要的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){}
}
聽起來就像一個計劃 - 使用WCF,甚至可以從同一服務(不限於使用net.tcp)暴露多個端點(通過多個協議) – 2011-04-13 05:44:21
原來WCF是一個很好的選擇!在從西雅圖到明尼阿波利斯的飛機上,我寫了一個WCF服務,完成了一個代碼優先的EF4數據層。這是非常優雅,比我預期的更高性能。我做了一個小客戶端發送每個相當大的日誌消息(比我們以前寫的任何日誌消息都大),每個日誌消息在0.005秒內寫入。非常刺激。 – 2011-04-20 03:19:03