日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
WCF使用Header如何正確實(shí)現(xiàn)

對(duì)于一個(gè)經(jīng)驗(yàn)豐富的編程人員來說,它不可能不知道WCF為何物。作為一個(gè).NET Framework 3.5的重要組成部件,為我們帶來了非常大的好處。我們?cè)谶@里先來了解一下WCF使用Header的相關(guān)應(yīng)用技巧。

在WCF中如何實(shí)現(xiàn)登陸,典型的場(chǎng)景如下:

 
 
 
  1. [ServiceContract]  
  2. public interface ILogin {  
  3. [OperationContract]  
  4. bool Signin(string userName, string password);  
  5. }  
  6. [ServiceContract]  
  7. public interface IBizTest {  
  8. [OperationContract]  
  9. string GetWelcomeInfo();  

千萬別從WCF自帶的那個(gè)InstanceContextMode來想辦法,因?yàn)閃CF中的PerSession調(diào)用只是針對(duì)每個(gè)服務(wù)類而言的,除非你變態(tài)到服務(wù)端只有一個(gè)類來實(shí)現(xiàn)全部的接口;#t#

變個(gè)思路,能不能用類似.NET Remoting中的CallContext呢?但是查了一下WCF的手冊(cè),好像也沒有這么個(gè)東西,怎么解決呢?那就是Custom header.

解決方案提出前,需要知道一點(diǎn)的就是,服務(wù)端取客戶端送出的Header的方法:

先遍歷OperationContext.Current.IncomingMessageHeaders找出客戶端發(fā)送的Header Name,然后再用 OperationContext.Current.IncomingMessageHeaders.GetHeader(i)得到值就可以啦。

下面的問題就剩下客戶端怎么發(fā)送Custom Header了。

策略1:在每個(gè)客戶端Proxy中增加類似如下的代碼

 
 
 
  1. using (OperationContextScope scope = new 
    OperationContextScope(InnerChannel)) {  
  2. MessageHeader mh = MessageHeader.CreateHeader("HeaderName", 
    string.Empty, "HeaderValue");  
  3. OperationContext.Current.OutgoingMessageHeaders.Add(mh);  
  4. //…  
  5. }  
  6.  

但是每個(gè)客戶端都要增加,這樣的WCF使用Header的步驟太麻煩了,所以,引出

2.自定義一個(gè)CallContextAttribute,代碼如下:

1. 先定義一個(gè)IClientMessageInspector接口的實(shí)現(xiàn)類

 
 
 
  1. public class ContextHeader : IClientMessageInspector {  
  2. public void AfterReceiveReply(ref System.ServiceModel.
    Channels.Message reply, object correlationState) {  
  3. //  
  4. }  
  5. public object BeforeSendRequest(ref System.ServiceModel.
    Channels.Message request, IClientChannel channel) {  
  6. MessageHeader clientHeader = MessageHeader.CreateHeader
    ("headerName", string.Empty, "headerValue");  
  7. request.Headers.Add(clientHeader);  
  8. return null;  
  9. }  

OK , 然后就可以實(shí)現(xiàn)CallContextAttribute了

 
 
 
  1. public class CallContextAttribute : Attribute, IEndpointBehavior,
     IOperationBehavior {  
  2. IEndpointBehavior Members#region IEndpointBehavior Members  
  3. public void AddBindingParameters(ServiceEndpoint endpoint, 
    BindingParameterCollection bindingParameters) {  
  4. }  
  5. public void ApplyClientBehavior(ServiceEndpoint endpoint, 
    ClientRuntime clientRuntime) {  
  6. clientRuntime.MessageInspectors.Add(new ContextHeader());  
  7. }  
  8. public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 
    EndpointDispatcher endpointDispatcher) {  
  9. }  
  10. public void Validate(ServiceEndpoint endpoint) {  
  11. }  
  12. #endregion  
  13. IOperationBehavior Members#region IOperationBehavior Members  
  14. public void AddBindingParameters(OperationDescription operationDescription, 
    BindingParameterCollection bindingParameters) {  
  15. }  
  16. public void ApplyClientBehavior(OperationDescription operationDescription,
     ClientOperation clientOperation) {  
  17. clientOperation.Parent.MessageInspectors.Add(new ContextHeader ());  
  18. }  
  19. public void ApplyDispatchBehavior(OperationDescription operationDescription, 
    DispatchOperation dispatchOperation) {  
  20. }  
  21. public void Validate(OperationDescription operationDescription) {  
  22. }  
  23. #endregion  

完工大吉,***在我們Contract中加入CallContextAttribute就可以啦,客戶端不用增加任何代碼了。

 
 
 
  1. [ServiceContract]  
  2. [CallContext]  
  3. public interface IBizTest {  
  4. [OperationContract]  
  5. [CallContext]  
  6. string GetWelcomeInfo();  

以上就是我們?yōu)榇蠹医榻B的WCF使用Header的相關(guān)操作方法。


網(wǎng)站題目:WCF使用Header如何正確實(shí)現(xiàn)
文章出自:http://www.dlmjj.cn/article/ccecjoi.html