擴充套件WCF自定義行為(二)
在上一篇文章中介紹了WCF執行時體系結構及客戶、伺服器端的擴充套件點。下面以一個簡單的Demo來演示擴充套件WCF的執行時行為。原始碼下載。
假設有一個WCF服務介面,提供以使用者名稱進行使用者身份編號的查詢。
public interface IIdentityService
{
[IdentityValidate]
[IdentityCache]
[OperationContract]
int GetIDByName(string name);
}
一,自定義引數檢查器
假設業務規則要求IIdentityService服務介面的使用者名稱引數不能為空,且必須不少於3個字元。在這種情況下,我們需要在伺服器端進行引數檢查,此檢查在服務介面操作(GetIDByName)呼叫前執行,如果引數檢查不通過,丟擲異常,終止執行後續的操作呼叫。自定義引數檢查器都實現IParameterInspector介面。該介面定義兩個方法:AfterCall、BeforeCall,分別是在服務介面操作呼叫前和呼叫後進行引數檢查。
{
int identityParamIndex;
public NameInspector() : this(0) { }
public NameInspector(int ParamIndex)
{
this.identityParamIndex = ParamIndex;
}
#region IParameterInspector Members
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
}
public object BeforeCall(string operationName, object[] inputs)
{
string Param = inputs[this.identityParamIndex] as string;
if (Param==null||Param .Length <3)
throw new FaultException("Invalid name. ");
return null;
}
#endregion
}
同時,可以定義一個申明標籤來新增這個自定義引數檢查器到WCF的執行時行為中。該標籤實現IOperationBehavior介面。
{
#region IOperationBehavior Members
public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
NameInspector nameInspector = new NameInspector();
clientOperation.ParameterInspectors.Add(nameInspector);
}
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
NameInspector nameInspector = new NameInspector();
dispatchOperation.ParameterInspectors.Add(nameInspector);
}
public void Validate(OperationDescription operationDescription)
{
}
#endregion
}
二, 自定操作呼叫器
假設IIdentityService服務介面需要頻繁地被呼叫、而且每次呼叫的服務端資源開銷比較大。在這種情況下我們希望在服務端操作呼叫中快取服務呼叫的結果。自定義一個服務端操作呼叫器,該操作呼叫器實現IOperationInvoker介面,並在Invoke方法中使用了呼叫結果快取功能。Invoke方法首先嚐試在其快取中查詢引數對應的結果,如果找到則直接返回該結果,如果找不到快取結果則呼叫預設的操作呼叫器獲取結果並快取該結果。
{
IOperationInvoker innerOperationInvoker;
Dictionary<string, int> identityCache = new Dictionary<string, int>();
public IdentityCaching(IOperationInvoker innerOperationInvoker)
{
this.innerOperationInvoker = innerOperationInvoker;
}
#region IOperationInvoker Members
public object[] AllocateInputs()
{
return this.innerOperationInvoker.AllocateInputs();
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
string name = inputs[0] as string;
int value;
if (this.identityCache.TryGetValue(name, out value))
{
outputs = new object[0];
return value;
}
else
{
value = (int)this.innerOperationInvoker.Invoke(
instance, inputs, out outputs);
identityCache[name] = value;
return value;
}
}
public IAsyncResult InvokeBegin(object instance, object[] inputs,
AsyncCallback callback, object state)
{
return this.innerOperationInvoker.InvokeBegin(
instance, inputs, callback, state);
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
return this.innerOperationInvoker.InvokeEnd(
instance, out outputs, result);
}
public bool IsSynchronous
{
get { return innerOperationInvoker.IsSynchronous; }
}
#endregion
}
同時,可以定義一個申明標籤來新增這個自定操作呼叫器到WCF的執行時行為中。該標籤實現IOperationBehavior介面。
{
#region IOperationBehavior Members
public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
}
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new IdentityCaching(dispatchOperation.Invoker);
}
public void Validate(OperationDescription operationDescription)
{
}
#endregion
}
總結
WCF的體系結構執行進行大量的執行時自定義,其分佈在排程、代理相互動的整個生命週期。除了執行引數檢查、訊息檢查、訊息格式化、操作選擇、操作呼叫等自定義擴充套件外,還可以定義更高階的擴充套件來處理例項化、併發、定址和安全等事項。這些更高階的擴充套件將在以後的文章中介紹。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-610383/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HIVE自定義函式的擴充套件Hive函式套件
- Android自定義字型--自定義TextView(可擴充套件不同ttf字Android自定義字型TextView套件
- JMeter擴充套件開發:自定義函式JMeter套件函式
- JMeter 擴充套件開發:自定義 Java SamplerJMeter套件Java
- 實戰 | 執行緒池的幾種自定義擴充套件執行緒套件
- django實現自定義manage命令的擴充套件Django套件
- .Net Core AutoMapper自定義擴充套件方法的使用APP套件
- 基於shiro的自定義註解的擴充套件套件
- 程式碼演示Mybatis-Generator 擴充套件自定義生成MyBatis套件
- DcatAdmin 擴充套件: 自定義表單(動態表單)套件
- tep0.9.5支援自定義擴充套件request套件
- form-create-designer中怎麼擴充套件自定義元件ORM套件元件
- Laravel-admin 自定義擴充套件,jQuery 語法錯誤?Laravel套件jQuery
- node-exporter 擴充套件用法 – shell 自定義 exporter 監控Export套件
- day88-ElasticSearch-分詞- 自定義擴充套件詞庫Elasticsearch分詞套件
- 開發函式計算的正確姿勢———為 PHP 執行時新增自定義擴充套件函式PHP套件
- Laravel 框架擴充套件 Auth 認證,實現自定義 driver,guardLaravel框架套件
- jquery 擴充套件方法($.fn.extend/$.extend) 自定義外掛 拖拽jQuery套件
- AbpVnext使用分散式IDistributedCache Redis快取(自定義擴充套件方法)分散式Redis快取套件
- JMeter 擴充套件開發:自定義 JMeter 外掛的除錯JMeter套件除錯
- Spring擴充套件之二:ApplicationListenerSpring套件APP
- [外掛擴充套件]onethink自定義分類標籤-關聯模型套件模型
- JMeter 擴充套件外掛實現對自定義協議的支援JMeter套件協議
- EFCore3.1+編寫自定義的EF.Functions擴充套件方法Function套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- [外掛擴充套件]自定義表單外掛【2015-02-28更新】套件
- Spring Cloud 中自定義外部化擴充套件機制原理及實戰SpringCloud套件
- [WCF許可權控制]透過擴充套件自行實現服務授權套件
- 擴充spring元件之自定義標籤Spring元件
- hibernate跨資料庫,json欄位處理方案,自定義擴充套件JsonStringType資料庫JSON套件
- JVM自定義類載入器在程式碼擴充套件性的實踐JVM套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- JSR303自定義校驗註解,自定義註解校驗字串是否是JSON字串,可擴充套件字串JSON套件
- 為Unity元件編寫擴充套件Unity元件套件
- Python為什麼能擴充套件Python套件
- 介紹一個能夠對日誌檔案進行自定義高亮的 VS Code 擴充套件套件
- activiti通過擴充套件點重寫節點行為套件
- Thinkphp實戰利用鉤子使用行為擴充套件 (Hook)PHP套件Hook
- spring4.1.8擴充套件實戰之一:自定義環境變數驗證Spring套件變數