假設定義了乙個服務契約:
[servicecontract(namespace = "wcfextension.services.inte***ce")]
public
inte***ce itestservice
首先看一下,客戶端是怎麼使用的:
console.writeline(wcfservicelocator.create().add(1, 3));
wcfservicelocator.create()出來的就是乙個介面,可以保持這個引用以後呼叫,也可以每次直接這麼寫,那麼來看看wcfservicelocator:
public
static t create() where t : class
public
static iwcflogservice getlogservice()
create方法很簡單,只是返回乙個servicerealproxy的透明**。這個之後會詳細說,下面單獨有乙個getlogservice專門用於獲取日誌服務。這裡通過心跳來判斷遠端的日誌服務是否可用,如果不可用直接返回本地的日誌服務。之所以日誌服務的真實**和其它業務服務的真實**不同是因為,在業務服務中我們需要加入很多橫切日誌,在日誌服務中不需要:
public
override imessage invoke(imessage msg)
catch (exception ex)
if (wcflogmanager.current().exceptioninfo.client.enabled)
methodreturn = new returnmessage(exception, methodcall);
}else}}
finally
}return methodreturn;
}}
這就是servicerealproxy的invoke方法實現了,可以看到:
1) 在這裡我們using了wcfserviceclientfactory.createserviceclient返回的包裝後的channel,讓每一次呼叫都可以正常關閉通道。
2) 在這裡我們加入了呼叫方法成功後的日誌,以及出錯時的異常日誌。
internal
sealed
public t channel }
#region idisposable members
public
void dispose()
private
bool disposed;
private
void dispose(bool disposing)
catch (communicationexception)
catch (timeoutexception)
catch (exception)}}
disposed = true;
}#endregion
}
using (var scf = wcfserviceclientfactory.createserviceclient())
使用的直接是契約介面,不需要scf.channel.xx(),不需要using。最後,來看看logservice的真實**,乾淨多了:
public
override imessage invoke(imessage msg)
catch (exception ex)
else
}return methodreturn;
}}
即使出錯也不會再呼叫日誌服務,而是記錄本地日誌,實現了乙個比較簡單的本地日誌服務:
static locallogservice()
public
static
void log(string text)
WCF實現雙工通訊及客戶端呼叫
新建乙個windows窗體應用程式 即客戶端client 和乙個wcf服務庫 wcf雙工 在wcf雙工專案下 新建一歌ilogger介面和實現該介面的logger類 在ilogger介面中 using system using system.collections.generic using sys...
CAS單點登入三 客戶端獲取登入資訊
通過上篇的配置,登入是從資料庫中進行驗證了。那麼現在要解決的問題是,客戶端怎麼知道登入者是誰呢?如何獲取登入者的資訊。首先還是開啟deployerconfigcontext.xml這個配置檔案 找到id為attributerepository的bean。預設這個bean配置的應該是org.jasig...
PHP漏洞全解 三 客戶端指令碼植入
客戶端指令碼植入 script insertion 是指將可以執行的指令碼插入到表單 動畫或超連結文字等物件內。當使用者開啟這些物件後,攻擊者所植入的指令碼就會被執行,進而開始攻擊。可以被用作指令碼植入的html標籤一般包括以下幾種 1 無限彈框 插入跳轉釣魚頁面 或者使用其他自行構造的js 進行攻...