(宿主在IIS, Application, WAS, WindowsService)
介紹
WCF(Windows Communication Foundation) - 宿主(Hosting):WCF服務可以宿主在IIS, Application, WAS, WindowsService。本文以宿主在WindowsService為例。
示例
1、服務
IHello.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCF.ServiceLib.Sample { /**//// <summary> /// IHello接口 /// </summary> [ServiceContract] public interface IHello { /**//// <summary> /// 打招呼方法 /// </summary> /// <param name="name">人名</param> /// <returns></returns> [OperationContract] string SayHello(string name); } }
Hello.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCF.ServiceLib.Sample { /**//// <summary> /// Hello類 /// </summary> public class Hello : IHello { /**//// <summary> /// 打招呼方法 /// </summary> /// <param name="name">人名</param> /// <returns></returns> public string SayHello(string name) { return "Hello: " + name; } } }
2、宿主
Hello.cs(WindowsService)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Configuration; using System.Configuration.Install; using System.ServiceModel; using System.ServiceProcess; namespace WCF.ServiceHostByWindowsService.Sample { /**//// <summary> /// 初始化 System.Configuration.Install.Installer 類的新實例。 /// </summary> [RunInstaller(true)] public class ProjectInstaller : Installer { private ServiceProcessInstaller process; private ServiceInstaller service; /**//// <summary> /// 構造函數 /// </summary> public ProjectInstaller() { process = new ServiceProcessInstaller(); process.Account = ServiceAccount.LocalSystem; service = new ServiceInstaller(); service.ServiceName = "WCF.ServiceHostByWindowsService"; service.Description = "WCF服務宿主在WindowsService[webabcd測試用]"; base.Installers.Add(process); base.Installers.Add(service); } } /**//// <summary> /// Windows服務類 /// </summary> public class WindowsService : ServiceBase { public ServiceHost serviceHost = null; /**//// <summary> /// 主函數 /// </summary> public static void Main() { ServiceBase.Run(new WindowsService()); } /**//// <summary> /// 構造函數 /// </summary> public WindowsService() { base.ServiceName = "WCF.ServiceHostByWindowsService"; } /**//// <summary> /// 啟動Windows服務 /// </summary> /// <param name="args">args</param> protected override void OnStart(string[] args) { if (serviceHost != null) { serviceHost.Close(); } // 為WCF.ServiceLib.Sample.Hello創建ServiceHost serviceHost = new ServiceHost(typeof(WCF.ServiceLib.Sample.Hello)); serviceHost.Open(); ServiceHost的幾個事件(顧名思義)#region ServiceHost的幾個事件(顧名思義) /**//* serviceHost.Opening += serviceHost.Opened += serviceHost.Closing += serviceHost.Faulted += serviceHost.UnknownMessageReceived += */ #endregion } /**//// <summary> /// 停止Windows服務 /// </summary> protected override void OnStop() { if (serviceHost != null) { serviceHost.Close(); serviceHost = null; } } } }
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <!--name - 提供服務的類名--> <!--behaviorConfiguration - 指定相關的行為配置--> <service name="WCF.ServiceLib.Sample.Hello" behaviorConfiguration="SampleBehavior"> <!--address - 服務地址--> <!--binding - 通信方式--> <!--contract - 服務契約--> <endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Sample.IHello" /> <!--元數據交換的endpoint--> <!--注:address是mex,它會和host/baseAddresses節點中的baseAddress做拼接,即提供元數據交換的地址為:http://localhost:12345/Binding/mex--> <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" /> <host> <baseAddresses> <add baseAddress="http://localhost:11233/ServiceHostByWindowsService/"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="SampleBehavior"> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
3、客戶端
Hello.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Hello.aspx.cs" Inherits="Hosting_Hello" Title="宿主Hosting(服務宿主在WindowsService)" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <div> <ul> <li style="color: Red;">本例為宿主在WindowsService的示例</li> <li>宿主在IIS請參見本解決方案的ServiceHost項目</li> <li>宿主在應用程序請參見本解決方案的ServiceHost2項目</li> <li>應用程序自宿主就是把本解決方案的ServiceLib項目和ServiceHost2項目結合在一起</li> <li>宿主在Windows Activation Services(WAS),因為我沒有環境,就先不寫示例了</li> </ul> </div> <asp:TextBox ID="txtName" runat="server" Text="webabcd" /> <asp:Button ID="btnSayHello" runat="server" Text="Hello" OnClick="btnSayHello_Click" /> </asp:Content>
Hello.aspx.cs
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class Hosting_Hello : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnSayHello_Click(object sender, EventArgs e) { var proxy = new HostingByWindowsService.HelloClient(); Page.ClientScript.RegisterStartupScript( this.GetType(), "js", string.Format("alert('{0}')", proxy.SayHello(txtName.Text)), true); proxy.Close(); } }
Web.config
<?xml version="1.0"?> <configuration> <system.serviceModel> <client> <!--address - 服務地址--> <!--binding - 通信方式--> <!--contract - 服務契約--> <endpoint address="http://localhost:11233/ServiceHostByWindowsService/" binding="wsHttpBinding" contract="Sample.IHello" /> </client> </system.serviceModel> </configuration>
運行結果:
啟動"WCF.ServiceHostByWindowsService"服務,單擊"Hello"按鈕後彈出提示框,顯示"Hello: webabcd"
OK