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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF編碼器正確創(chuàng)建方式解讀

在應(yīng)用WCF之前,我們需要?jiǎng)?chuàng)建一個(gè)編碼器來幫組我們的程序開發(fā)。那么如何才能正確的實(shí)現(xiàn)WCF編碼器的創(chuàng)建呢?首先,我們需要?jiǎng)?chuàng)建一個(gè)定制的MessageEncoderFactory,它能創(chuàng)建我們的定制的編碼器對象,它需要:#t#

一個(gè)被覆蓋的編碼器對象

一個(gè)被覆蓋的消息版本

包含一個(gè)從CustomMessageEncoder工廠創(chuàng)建的名為CustomEncoderFactory的樣本類。我們需要將該編碼器標(biāo)記為一個(gè)單獨(dú)的CustomMessageEncoder工廠對象。

為了創(chuàng)建一個(gè)CustomEncoderFactory實(shí)例,需要傳入兩個(gè)新的東西:一個(gè)EncodeMode枚舉值以及一個(gè)EnableCompression變量:

EncodeMode是一個(gè)可根據(jù)配置值動態(tài)改變編碼格式,并且無需知道任何特殊的WCF編碼器的深入知識就可以編寫壓縮/解壓縮邏輯的枚舉值。它支持各種壓縮類型,包括None、Deflate、Gzip,同時(shí),我們還可以添加更多定制的壓縮編碼器格式:

 
 
 
  1. /// <  summary>
  2. /// Compression Encoder formats. Add custom encoders such as 
  3. /// ICSharpLib, 7z, rar 
  4. /// <  /summary>
  5. public enum CompressionEncoder
  6. {
  7. None,
  8. Deflate,
  9. GZip
  10. }

EnableCompression是一個(gè)布爾開關(guān)值,通過它可以啟用或者禁用壓縮處理。

接下來,我們需要?jiǎng)?chuàng)建一個(gè)CustomEncoder,以實(shí)現(xiàn)抽象類MessageEncoder,具體代碼如清單2所示。清單2的示例代碼實(shí)現(xiàn)了IsDataCompressed方法,用以確定數(shù)據(jù)是否已經(jīng)壓縮。對于Gzip,可以使用“幻碼”值來確定數(shù)據(jù)是否經(jīng)過壓縮處理。

就像前面提到的那樣,這個(gè)定制的WCF編碼器的編碼過程是在ReadMessage和WriteMessage方法中進(jìn)行的。所以,我們還需要覆蓋ContentType屬性來交付不同的內(nèi)容類型。枚舉類型的CompressionEncoder變量值決定了運(yùn)行時(shí)的內(nèi)容類型。

然后,我們需要?jiǎng)?chuàng)建一個(gè)CustomMessageEncodingBinding元素,以便規(guī)定可配置的定制屬性,在本例中它包含EnableCompression、CompressionEncoder 和捆綁元素。

***,我們需要?jiǎng)?chuàng)建一個(gè)CustomMessageEncodingElement元素,它派生自BindingElementExtensionElement類。

從配置文件讀取這些值之后,CreateBindingElement方法充當(dāng)一個(gè)入口點(diǎn),并將這些值轉(zhuǎn)換成定制的捆綁元素的適當(dāng)?shù)膶傩浴?/p>

我們需要注意的事項(xiàng)如下所示:CreateBindingElement方法,它充當(dāng)一個(gè)入口點(diǎn)。

注意,我們可以通過配置修改捆綁元素的messageversion屬性,但是為簡單起見,我們在此不對此加以討論。

ApplyConfiguration方法,它使我們可以顯式指定屬性。

ReaderQuotas,它用來給CustomMesssageEncodingBindingElement指定屬性。

值ReaderQuotas.MaxArrayLength可以控制請求大小。因?yàn)檫@個(gè)例子使用定制的捆綁,所以需要將其設(shè)為捆綁元素。

***,需要實(shí)現(xiàn)CustomBindingElement的配置部分。對于客戶端,配置看上去是這樣的:

 
 
 
  1. < system.serviceModel>
  2. < extensions>
  3. < bindingElementExtensions>
  4. < add name="customMessageEncoding" type=" 
  5. Infrastructure.CustomEncoder.CustomMessageEncodingElement, assemblyname" />
  6. < /bindingElementExtensions>
  7. < /extensions>
  8. < bindings>
  9. < customBinding>
  10. < binding name="myBinding">
  11. < customMessageEncoding innerMessageEncoding=
  12. "textMessageEncoding" enableCompression="false"
  13. compressionEncode="gzip">
  14. < readerQuotas maxArrayLength="62914560" >< /readerQuotas>
  15. < /customMessageEncoding >
  16. < httpTransport maxBufferSize="62914560" 
  17. maxReceivedMessageSize="62914560"
  18. authenticationScheme="Anonymous" 
  19. proxyAuthenticationScheme="Anonymous"
  20. useDefaultWebProxy="true"
  21. />
  22. < /binding>
  23. < /customBinding> 
  24. < /bindings>
  25. < client>
  26. < endpoint address="http://127.0.0.1/mywcf.services/service1.svc"
  27. binding="customBinding" bindingConfiguration="myBinding"
  28. contract="IService" name="Service1">
  29. < /endpoint>
  30. < /client>
  31. < /system.serviceModel>

上面創(chuàng)建的定制的捆綁使用新的CustomMessageEncoding。請求通常不需要壓縮,因?yàn)樗鼈兺ǔ:苄?事實(shí)上,壓縮它們反而會增加請求的尺寸。因此,以上顯示的客戶端配置文件了enableCompression ="false"的設(shè)置。服務(wù)器配置看起來象這樣:

 
 
 
  1. < system.serviceModel>
  2. < extensions>
  3. < bindingElementExtensions>
  4. < add name="customMessageEncoding" type=" 
  5. Infrastructure.CustomEncoder.CustomMessageEncodingElement, assemblyname" />
  6. < /bindingElementExtensions>
  7. < /extensions>
  8. < bindings>
  9. < customBinding>
  10. < binding name="myBinding">
  11. < customMessageEncoding 
  12. innerMessageEncoding="textMessageEncoding" 
  13. enableCompression="true"
  14. compressionEncode="gzip">
  15. < readerQuotas 
  16. maxArrayLength="62914560" >
  17. < /readerQuotas>
  18. < /customMessageEncoding >
  19. < httpTransport maxBufferSize="62914560" 
  20. maxReceivedMessageSize="62914560"
  21. authenticationScheme="Anonymous" 
  22. proxyAuthenticationScheme="Anonymous"
  23. useDefaultWebProxy="true" />
  24. < /binding>
  25. < /customBinding> 
  26. < bindings>
  27. < services>
  28. < service behaviorConfiguration="Host.Behavior"
  29. name="Host.Service">
  30. endpoint address="" 
  31. binding="customBinding" 
  32. bindingConfiguration="myBinding"
  33. contract="ServiceContracts.IService" />
  34. < endpoint address="mex" binding="mexHttpBinding" 
  35. contract="IMetadataExchange" />
  36. < /service>
  37. < /services>
  38. < /system.serviceModel>

通過閱讀本文,您會發(fā)現(xiàn)向我們的WCF編碼器中添加定制的編碼不僅簡單,而且還是透明的。我們的示例代碼不僅包含了文中描述的class屬性的詳盡的源代碼,而且還提供了所需的配置章節(jié)。


新聞標(biāo)題:WCF編碼器正確創(chuàng)建方式解讀
鏈接地址:http://www.dlmjj.cn/article/dpooici.html