wcf系列---- binding的使用(1)
文轉(zhuǎn)自http://www.cnblogs.com/huangxincheng/archive/2011/10/23/2221845.html
作為WCF速成系列,只介紹些項(xiàng)目開發(fā)中常用到的實(shí)戰(zhàn)知識。
?
學(xué)習(xí)wcf,還是對其中的幾個術(shù)語要了解一下。wcf中有一個ABC的概念,就是
?????????? 第一: "A" 是地址,就是告訴別人我wcf在何處。
第二: "B"是綁定,就是告訴別人應(yīng)該走什么路才能過來。
第三: "C"是契約:就是告訴別人我wcf這里有哪些東西。
?
項(xiàng)目開發(fā)中常用到的三種綁定:
????????? 第一:wsHttpBinding,? 這個binding可以認(rèn)為是webservice的加強(qiáng)版WSE,設(shè)計(jì)的目的就是用于異構(gòu)系統(tǒng)的交互(比如java)。
????????? 第二:netTcpBinding,?? 這個binding可以認(rèn)為是remoting的加強(qiáng)版,設(shè)計(jì)的目的就是用于不同機(jī)器的.net 程序交互,
????????? 第三: netMsmqBinding,? 這個binding可以認(rèn)為是msmq的加強(qiáng)版本,設(shè)計(jì)目的就是脫機(jī)環(huán)境下不同機(jī)器的.net程序交互,確保信息不丟失。
?????
下面對前二種binding的實(shí)際代碼運(yùn)用。
?
第二步: 既然”C"已經(jīng)出來了,那么她必須要有承載她的環(huán)境,也就是所謂的“宿主”。這里用console來承載。
???????????????? 新建console程序。
??第三步:現(xiàn)在服務(wù)處于預(yù)開啟狀態(tài),為了讓wcf更加靈活,更加容易控制,就要將相關(guān)配置寫入到config里面。
????????????? 在console類庫中新建一個config文件,最后運(yùn)行console程序正式啟動。代碼圖如下:
<!--定義客戶端元數(shù)據(jù)類型--><behaviors>
<serviceBehaviors>
<!--配置名稱-->
<behavior name="wsHttpBindingExample.MyserviceBehavior">
<!--客戶端是否支持HttpGet方式獲取數(shù)據(jù)-->
<serviceMetadata httpGetEnabled="true" />
<!--客戶端是否能捕獲異常-->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--數(shù)據(jù)配置-->
<!--name就是服務(wù)名稱,behaviorConfiguration:服務(wù)要暴露元數(shù)據(jù) -->
<service
behaviorConfiguration="wsHttpBindingExample.MyserviceBehavior"
name="wsHttpBindingExample.Myservice">
<!--address:就是告訴wcf的地址是基地址baseAddresses,這個地方可以定義相對地址和決定地址-->
<!--binding:該wcf走的協(xié)議是http協(xié)議wse-->
<!--contract:就是契約內(nèi)容-->
<endpoint
address=""
binding="wsHttpBinding"
contract="wsHttpBindingExample.IMyservice">
<!--定義服務(wù)器類型-->
<!--<identity>
<dns value="localhost" />
</identity>-->
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<!--二個用途:第一:這個地址用于給客戶端作為服務(wù)引用的地址-->
<!--二個用途;第二,做為endpoint的基地址存在-->
<add baseAddress="http://localhost:8732/Design_Time_Addresses/wsHttpBindingExample/Myservice/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
最后:? wcf已經(jīng)開啟,正在監(jiān)視著address,然后我們就是先建一個console的Client程序,“引用”中“點(diǎn)擊右鍵”添加服務(wù)引用。
客戶端應(yīng)用代碼:
???? 如果大家看懂了wsHttpBinding如何使用,那么改成netTcpBinding將會是輕而易舉。 因?yàn)橹灰薷膬蓚€地方即可。
?
?????????? 第一:修改配置文件中的endpoint地址。
?????? 為了配置大文件傳輸我們需要重新定義bindings
<?xml version="1.0" encoding="utf-8" ?><configuration>
<system.serviceModel>
<!--定義客戶端元數(shù)據(jù)類型-->
<behaviors>
<serviceBehaviors>
<!--配置名稱-->
<behavior name="wsHttpBindingExample.MyserviceBehavior">
<!--客戶端是否支持HttpGet方式獲取數(shù)據(jù)-->
<serviceMetadata httpGetEnabled="false" />
<!--客戶端是否能捕獲異常-->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--數(shù)據(jù)配置-->
<service
behaviorConfiguration="wsHttpBindingExample.MyserviceBehavior"
name="netTcpBindingExample.ManFly">
<!--address:這個地址是絕對地址用的協(xié)議netTcp協(xié)議傳輸-->
<!--binding:該wcf走的協(xié)議是netTcpBinding協(xié)議-->
<!--contract:就是契約內(nèi)容-->
<endpoint
address=""
binding="netTcpBinding"
contract="netTcpBindingExample.IFly"
bindingConfiguration="netTcpBindConfig"
/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<!--二個用途:第一:這個地址用于給客戶端作為服務(wù)引用的地址-->
<!--二個用途;第二,做為endpoint的基地址存在-->
<add baseAddress="net.tcp://localhost:8735/Design_Time_Addresses/netTcpBindingExample/ManFly/" />
</baseAddresses>
</host>
</service>
</services>
<!--定義netTcpBinding協(xié)議為主-->
<!--如果想傳輸大文件,下面幾個配置也是必不可少的:
maxBufferPoolSize="2147483647 "
maxBufferSize="2147483647 "
maxReceivedMessageSize="2147483647 "
1、closeTimeout指定完成關(guān)閉操作提供的時(shí)間間隔、默認(rèn)值為一分鐘
2、hostnameComparisonMode指定用于分析的Http主機(jī)名比較模式 默認(rèn)值為StrongWildcard
3、listenBacklog指定偵聽器傷等待接受的最大通道數(shù)
4、connectionTimeout 屬性限制客戶端在引發(fā)連接異常之前將等待連接的時(shí)間。默認(rèn)值為 10
5、maxBufferPoolSize一個整數(shù),指定此綁定的最大緩沖池大小,默認(rèn)是512*1024字節(jié)
6、maxBufferSize正整數(shù),指定內(nèi)存中用于存儲消息的存儲區(qū)的最大大小(字節(jié))
如果 transferMode 屬性等于 Buffered,則此屬性應(yīng)等于 maxReceivedMessageSize 屬性值。
如果 transferMode 屬性等于 Streamed,則此屬性不能大于 maxReceivedMessageSize 屬性值,應(yīng)當(dāng)至少為標(biāo)頭的大小。
默認(rèn)值為 65536。
7、maxConnections整數(shù)指定服務(wù)將創(chuàng)建/接受的最大出站和入站連接數(shù)。傳入和傳出連接分別根據(jù)此屬性指定的限制進(jìn)行計(jì)數(shù)。默認(rèn)值為10
8、maxReceivedMessageSize正整數(shù),指定采用此綁定配置的通道上可以接受的最大信息大小,包括信息頭,如果消息超出此限制則發(fā)送方將收到 SOAP 錯誤。接收方將刪除該消息,并在跟蹤日志中創(chuàng)建事件項(xiàng)。默認(rèn)值為 65536。
9、name一個包含綁定的配置名稱的字符串。因?yàn)榇酥涤米鹘壎ǖ臉?biāo)識,所以它應(yīng)該是唯一的。.net4.0;里面就沒自動配置了
10、openTimeout指定完成打開操作提供的時(shí)間間隔
11、portSharingEnabled一個布爾值,指定是否為此連接啟用 TCP 端口共享。如果此值為 false,則每個綁定都使用自己的獨(dú)占端口。此設(shè)置只與服務(wù)相關(guān),因?yàn)榭蛻舳瞬皇苡绊憽?br />12、receiveTimeout一個 TimeSpan 值,指定為完成接收操作提供的時(shí)間間隔。此值應(yīng)大于或等于 Zero。默認(rèn)值為 00:10:00。
13、sendTimeout一個 TimeSpan 值,指定為完成發(fā)送操作提供的時(shí)間間隔。此值應(yīng)大于或等于 Zero。默認(rèn)值為 00:01:00。
14、transactionFlow一個布爾值,指定綁定是否支持流動 WS-Transactions。默認(rèn)值為 false。
15、transactionProtocol指定與此綁定一起使用的事務(wù)處理協(xié)議。有效值為OleTransactions WSAtomicTransactionOctober2004 默認(rèn)值為 OleTransactions。此屬性的類型為 TransactionProtocol。
16、transferMode一個 TransferMode 值,指定為請求或響應(yīng)對消息進(jìn)行緩沖處理還是流式處理。
-->
<bindings>
<netTcpBinding>
<binding
name="netTcpBindConfig"
closeTimeout="00:01:00"
openTimeout="00:1:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
transactionFlow="false"
transferMode="Buffered"
listenBacklog="10"
maxBufferPoolSize="2147583647"
maxBufferSize="2147483647"
maxConnections="10"
maxReceivedMessageSize="2147483647"
>
<readerQuotas maxDepth="32"
maxStringContentLength="2147483647 "
maxArrayLength="2147483647 "
maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<reliableSession ordered="true"
inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport
clientCredentialType="Windows"
protectionLevel="EncryptAndSign" />
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
至此我已經(jīng)安裝此博友的第一篇文章進(jìn)行了匯總
轉(zhuǎn)載于:https://www.cnblogs.com/zhijianliutang/archive/2011/11/14/2248090.html
總結(jié)
以上是生活随笔為你收集整理的wcf系列---- binding的使用(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 常用接口的实现--compar
- 下一篇: 逻辑查询处理的步骤