




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、WCF開(kāi)發(fā)框架形成之旅-WCF的幾種寄宿方式WCF寄宿方式是一種非常靈活的操作,可以在IIS服務(wù)、Windows服務(wù)、Winform程序、控制臺(tái)程序中進(jìn)行寄宿,從而實(shí)現(xiàn)WCF服務(wù)的運(yùn)行,為調(diào)用者方便、高效提供服務(wù)調(diào)用。本文分別對(duì)這幾種方式進(jìn)行詳細(xì)介紹并開(kāi)發(fā)例子進(jìn)行說(shuō)明,以求大家對(duì)WCF寄宿的方式進(jìn)行全面的認(rèn)識(shí)和了解。1、 WCF服務(wù)的IIS服務(wù)寄宿我在我前面幾篇WCF開(kāi)發(fā)框架的介紹文章中,介紹過(guò)了WCF常用的一種寄宿方式,IIS服務(wù)寄宿。這種寄宿方式是最為方便的方式,而且由于服務(wù)只需要IIS運(yùn)行就能自動(dòng)運(yùn)行起來(lái),因此廣為使用。創(chuàng)建這種方式IIS寄宿方式的,只需要在解決方案里面,添加WCF服務(wù)應(yīng)
2、用程序,就可以生成這種的服務(wù)模塊了。這個(gè)是一個(gè)基于Web的應(yīng)用程序,創(chuàng)建項(xiàng)目后會(huì)生成一個(gè)Service1.svc的服務(wù)頁(yè)面,以及相關(guān)的WCF服務(wù)接口和實(shí)現(xiàn),如下圖所示。這個(gè)就是簡(jiǎn)單的WCF服務(wù),當(dāng)然如果是復(fù)雜的實(shí)際應(yīng)用,會(huì)考慮和數(shù)據(jù)庫(kù)打交道,而且可能項(xiàng)目會(huì)分成幾個(gè)進(jìn)行管理,從而實(shí)現(xiàn)更好的邏輯分離操作。2、 創(chuàng)建WCF服務(wù)庫(kù)為多種寄宿做準(zhǔn)備除了上面常用的IIS服務(wù)寄宿,一般還會(huì)有各種各樣的寄宿方式,不過(guò)如果采用其他方式的寄宿方式,一般會(huì)把WCF服務(wù)和寄宿方式進(jìn)行項(xiàng)目的分離,實(shí)現(xiàn)更好的重用操作,特別WCF需要考慮多種寄宿方式的情況下。下面是WCF服務(wù)庫(kù)和WCF服務(wù)應(yīng)用程序的介紹說(shuō)明,先了解一下基礎(chǔ)
3、。WCF服務(wù)庫(kù),可以認(rèn)為是一個(gè)包含WCF服務(wù)以及契約定義的類庫(kù)。這里WCF服務(wù)庫(kù)還不能直接運(yùn)行,你可以在其他項(xiàng)目里引用,在宿主里啟用托管這個(gè)庫(kù)。而WCF應(yīng)用程序,是一個(gè)可以執(zhí)行的程序,它有獨(dú)立的進(jìn)程,WCF服務(wù)類契約的定義,可以直接看到運(yùn)行的效果。此項(xiàng)目模板應(yīng)該是基于IIS托管的程序。前者一般考慮WCF服務(wù)設(shè)計(jì)的時(shí)候,服務(wù)類的定義為單獨(dú)的庫(kù),可以為其它項(xiàng)目使用。提高代碼的復(fù)用性。后者在開(kāi)發(fā)基于IIS托管的WCF服務(wù)程序時(shí),比較多見(jiàn),自學(xué)的時(shí)候也可以使用這種類型。當(dāng)然你也可以修改這些代碼,比如把WCF服務(wù)程序里的類,移到一個(gè)單獨(dú)的類庫(kù)里。創(chuàng)建WCF服務(wù)庫(kù),可以理解為我們開(kāi)發(fā).NET程序時(shí)創(chuàng)建的一
4、個(gè)類庫(kù)模塊,不含界面,如下所示,創(chuàng)建一個(gè)WCF服務(wù)庫(kù)。確定后就只有一個(gè)示例服務(wù)Service1生成了。這里,我們?yōu)榱搜菔?,就不修改任何它們的代碼,原始的代碼如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace WcfServiceLibrarypublic class Service1 : IService1public string
5、GetData(int valuereturn string.Format("You entered: 0", value;public CompositeType GetDataUsingDataContract(CompositeType compositeif (composite = nullthrow new ArgumentNullException("composite"if (composite.BoolValuecomposite.StringValue += "Suffix"return composite;3、
6、WCF服務(wù)的控制臺(tái)程序寄宿這種也是一種常見(jiàn)的WCF服務(wù)寄宿方式,通過(guò)啟動(dòng)一個(gè)類似DOS窗口的控制臺(tái)軟件,實(shí)現(xiàn)WCF服務(wù)的動(dòng)態(tài)寄宿,關(guān)閉控制臺(tái)程序,服務(wù)就自然終止。這種方式很簡(jiǎn)單,創(chuàng)建一個(gè)控制臺(tái)程序,然后添加WCF服務(wù)類庫(kù)的項(xiàng)目應(yīng)用,在Main函數(shù)里面添加下面代碼即可實(shí)現(xiàn)。namespace WcfService_HostConsoleclass Programstatic void Main(string args tryServiceHost serviceHost = new ServiceHost(typeof(Service1;if (serviceHost.State != Comm
7、unicationState.OpenedserviceHost.Open(;Console.WriteLine("WCF 服務(wù)正在運(yùn)行."Console.WriteLine("輸入回車鍵 退出WCF服務(wù)"Console.ReadLine(;serviceHost.Close(;catch (Exception exConsole.WriteLine(ex;4、 WCF服務(wù)的Winform程序寄宿和控制臺(tái)程序一樣,我們創(chuàng)建一個(gè)Winform項(xiàng)目,然后在窗體啟動(dòng)代碼里面添加寄宿方式的代碼即可,為了較好的響應(yīng)體驗(yàn),可以使用后臺(tái)線程程序進(jìn)行服務(wù)啟動(dòng),如下所示。
8、namespace WcfService_HostWinformpublic partial class FrmMain : FormServiceHost serviceHost = null;BackgroundWorker worker = null;public FrmMain(InitializeComponent(;worker = new BackgroundWorker(;worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted;worker.DoWork
9、+= new DoWorkEventHandler(worker_DoWork;if (!worker.IsBusytssTips.Text = "正在啟動(dòng)."lblTips.Text = tssTips.Text;worker.RunWorkerAsync(;void worker_DoWork(object sender, DoWorkEventArgs etryserviceHost = new ServiceHost(typeof(Service1;if (serviceHost.State != CommunicationState.OpenedserviceHo
10、st.Open(;e.Result = "正常"catch (Exception exe.Result = ex.Message;void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs eif (e.Result != nullif (e.Result.ToString( = "正常"tssTips.Text = "服務(wù)正在進(jìn)行偵聽(tīng)."elsetssTips.Text = string.Format("錯(cuò)誤:0", e.Re
11、sult;lblTips.Text = tssTips.Text;.當(dāng)然為了防止Winform程序被不小心關(guān)閉,可以添加托盤代碼,把程序縮小到托盤圖標(biāo)里面。5、 WCF服務(wù)的Windows 服務(wù)程序寄宿這種方式的服務(wù)寄宿,和IIS一樣有一個(gè)一樣的優(yōu)點(diǎn),系統(tǒng)啟動(dòng)后,WCF服務(wù)也會(huì)跟著啟動(dòng)了,不用人工干預(yù),也是一種較好的寄宿方式。為了實(shí)現(xiàn)這種方式的寄宿,我們創(chuàng)建一個(gè)控制臺(tái)程序,然后添加響應(yīng)的Window服務(wù)和安裝程序類然后在服務(wù)類啟動(dòng)里面添加WCF的寄宿代碼,如下所示。public class ServiceManager : ServiceBase private static object s
12、yncRoot = new Object(;/同步鎖private ServiceHost serviceHost = null; /寄宿服務(wù)對(duì)象public ServiceManager(this.ServiceName = Constants.ServiceName;/ / 設(shè)置具體的操作,以便服務(wù)可以執(zhí)行它的工作。/ protected override void OnStart(string argstryserviceHost = new ServiceHost(typeof(Service1;if (serviceHost.State != CommunicationState.O
13、penedserviceHost.Open(;catch (Exception exLogTextHelper.Error(ex;LogTextHelper.Info(Constants.ServiceName + DateTime.Now.ToShortTimeString( + "已成功調(diào)用了服務(wù)一次。"LogTextHelper.Info(Constants.ServiceName + "已成功啟動(dòng)。"為了實(shí)現(xiàn)通過(guò)該控制臺(tái)程序?qū)崿F(xiàn)參數(shù)化安裝和卸載服務(wù),我們需要攔截控制臺(tái)的參數(shù),并進(jìn)行相應(yīng)的操作,如下所示。/ / 應(yīng)用程序的主入口點(diǎn)。/ STAThr
14、eadstatic void Main(string argsServiceController service = new ServiceController(Constants.ServiceName;/ 運(yùn)行服務(wù)if (args.Length = 0ServiceBase ServicesToRun;ServicesToRun = new ServiceBase new ServiceManager( ;ServiceBase.Run(ServicesToRun;else if (args0.ToLower( = "/i" | args0.ToLower( = &qu
15、ot;-i"#region 安裝服務(wù)if (!ServiceIsExisted(Constants.ServiceNametrystring cmdline = ;string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly(.Location;TransactedInstaller transactedInstaller = new TransactedInstaller(;AssemblyInstaller assemblyInstaller = new AssemblyInstaller(ser
16、viceFileName, cmdline;transactedInstaller.Installers.Add(assemblyInstaller;transactedInstaller.Install(new System.Collections.Hashtable(;TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10;service.Start(;service.WaitForStatus(ServiceControllerStatus.Running, timeout;catch (Exception exLogTextHelp
17、er.Info(ex;throw;#endregionelse if (args0.ToLower( = "/u" | args0.ToLower( = "-u"#region 刪除服務(wù)tryif (ServiceIsExisted(Constants.ServiceNamestring cmdline = ;string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly(.Location;TransactedInstaller transactedInstaller =
18、 new TransactedInstaller(;AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline;transactedInstaller.Installers.Add(assemblyInstaller;transactedInstaller.Uninstall(null;catch (Exception exLogTextHelper.Info(ex;throw; #endregion編譯程序成功后,我們添加兩個(gè)批處理的DOS腳本來(lái)實(shí)現(xiàn)執(zhí)行程序的自動(dòng)安裝和卸載,如下所示
19、。安裝腳本"WcfService_HostWinService.exe" -ipause卸載腳本"WcfService_HostWinService.exe" -upause順利執(zhí)行腳本后,服務(wù)列表里面就增加一個(gè)服務(wù)項(xiàng)目了。卸載操作,直接執(zhí)行腳本就會(huì)卸載服務(wù),非常方便哦。6、 WCF服務(wù)的Web寄宿當(dāng)然,除了以上幾種方式,這種以WCF服務(wù)庫(kù)的方式,也可以在Web方式進(jìn)行寄宿(IIS方式),這種方式更簡(jiǎn)單,添加一個(gè)后綴名的svc的文件,只需要一行代碼即可,如下所示。7、 使WCF服務(wù)支持GET方式調(diào)用有時(shí)候,我們?yōu)榱诵枰?,可能通過(guò)一個(gè)小程序發(fā)布一個(gè)服務(wù),然
20、后供其他程序進(jìn)行調(diào)用,可能是Web,也可以是Winform,但是我們是想提供一個(gè)基于HTTP,GET或者POST方式來(lái)實(shí)現(xiàn)接口的調(diào)用的,例如,提供一個(gè)JSON格式或者文本格式的內(nèi)容返回操作。如果是整合在Winform里面,那么我們?cè)赪inform里面添加一個(gè)WCF的項(xiàng),修改里面的代碼就可以了,如下所示。首先要在使用GET方式的WCF服務(wù)接口的添加說(shuō)明。如果是POS方式,增加設(shè)置有點(diǎn)不同(WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessage
21、Format.Jspace WcfServiceForWinformServiceContractpublic interface IService1OperationContractvoid DoWork(;OperationContractWebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Jsonstring GetData(int value;第二,在實(shí)現(xiàn)類里面添加相應(yīng)的設(shè)置namespace WcfServiceForWinformAspNetCompatibilityRequir
22、ements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowedpublic class Service1 : IService1public void DoWork(public string GetData(int valuereturn string.Format("You entered: 0", value;配置文件如下所示,顏色標(biāo)注特別的要注意:xml version="1.0"?><configuration><system.web>&l
23、t;compilation debug="true"/>system.web><system.serviceModel><services><service name="WcfServiceForWinform.Service1" behaviorConfiguration="ServiceConfig"><endpoint address="" binding="webHttpBinding"bindingConfiguration=&qu
24、ot;webHttpBindingWithJsonP" behaviorConfiguration="webHttpBehavior"contract="WcfServiceForWinform.IService1">endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /><host><baseAddresses><add baseAddress="http:/localhost:9000/Service1/" />baseAddresses>host>service>services><bindings><webHttpBinding><binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />webHt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)士怎么弄課題申報(bào)書
- 鄭州課題申報(bào)書
- 教育課題申報(bào)立項(xiàng)書范文
- 怎么搜到課題項(xiàng)目申報(bào)書
- epc和融資合同范例
- 課題立項(xiàng)申報(bào)書成果形式
- 美發(fā)教學(xué)課題申報(bào)書
- 課題申報(bào)書封面需蓋章嗎
- 農(nóng)村房產(chǎn)協(xié)議合同范例
- 包工清包合同范本
- 事故應(yīng)急預(yù)案演練流程圖
- 潔凈廠房監(jiān)理實(shí)施細(xì)則
- 哈工大研究生課程-高等結(jié)構(gòu)動(dòng)力學(xué)-第四章課件
- 當(dāng)代教育心理學(xué)(范圍)課件
- 完整版漢語(yǔ)語(yǔ)法知識(shí)課件
- 2023年湖南工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試筆試題庫(kù)及答案解析
- 2022年山東交通職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試筆試試題及答案解析
- 法院卷宗范本
- 公司戰(zhàn)略與風(fēng)險(xiǎn)管理教案
- 中醫(yī)美容-課件
- 自然辯證法概論課件:自然辨證法概論
評(píng)論
0/150
提交評(píng)論