化零为整WCF(5) - 宿主Hosting(宿主在IIS, Application, WAS, WindowsService)

[索引页]
[源码下载] 


化零为整WCF(5) - 宿主Hosting(宿主在IIS, Application, WAS, WindowsService)


作者: webabcd


介绍
WCF(Windows Communication Foundation) - 宿主(Hosting):WCF服务可以宿主在IIS, Application, WAS, WindowsService。本文以宿主在WindowsService为例。


示例
1、服务
IHello.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ServiceModel; 
InBlock.gif 
InBlock.gif namespace WCF.ServiceLib.Sample 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// IHello接口 
InBlock.gif         /// </summary> 
InBlock.gif        [ServiceContract] 
InBlock.gif         public  interface IHello 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 打招呼方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="name">人名</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                [OperationContract] 
InBlock.gif                 string SayHello( string name); 
InBlock.gif        } 
InBlock.gif}
Hello.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ServiceModel; 
InBlock.gif 
InBlock.gif namespace WCF.ServiceLib.Sample 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Hello类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class Hello : IHello 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 打招呼方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="name">人名</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  string SayHello( string name) 
InBlock.gif                { 
InBlock.gif                         return  "Hello: " + name; 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
2、宿主
Hello.cs(WindowsService)
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif 
InBlock.gif using System.ComponentModel; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Configuration.Install; 
InBlock.gif using System.ServiceModel; 
InBlock.gif using System.ServiceProcess; 
InBlock.gif 
InBlock.gif namespace WCF.ServiceHostByWindowsService.Sample 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 初始化 System.Configuration.Install.Installer 类的新实例。 
InBlock.gif         /// </summary> 
InBlock.gif        [RunInstaller( true)] 
InBlock.gif         public  class ProjectInstaller : Installer 
InBlock.gif        { 
InBlock.gif                 private ServiceProcessInstaller process; 
InBlock.gif                 private ServiceInstaller service; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public ProjectInstaller() 
InBlock.gif                { 
InBlock.gif                        process =  new ServiceProcessInstaller(); 
InBlock.gif                        process.Account = ServiceAccount.LocalSystem; 
InBlock.gif                        service =  new ServiceInstaller(); 
InBlock.gif                        service.ServiceName =  "WCF.ServiceHostByWindowsService"
InBlock.gif                        service.Description =  "WCF服务宿主在WindowsService[webabcd测试用]"
InBlock.gif                         base.Installers.Add(process); 
InBlock.gif                         base.Installers.Add(service); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         /// <summary> 
InBlock.gif         /// Windows服务类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class WindowsService : ServiceBase 
InBlock.gif        { 
InBlock.gif                 public ServiceHost serviceHost =  null
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 主函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  static  void Main() 
InBlock.gif                { 
InBlock.gif                        ServiceBase.Run( new WindowsService()); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public WindowsService() 
InBlock.gif                { 
InBlock.gif                         base.ServiceName =  "WCF.ServiceHostByWindowsService"
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 启动Windows服务 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="args">args</param> 
InBlock.gif                 protected  override  void OnStart( string[] args) 
InBlock.gif                { 
InBlock.gif                         if (serviceHost !=  null
InBlock.gif                        { 
InBlock.gif                                serviceHost.Close(); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 为WCF.ServiceLib.Sample.Hello创建ServiceHost 
InBlock.gif                        serviceHost =  new ServiceHost( typeof(WCF.ServiceLib.Sample.Hello)); 
InBlock.gif 
InBlock.gif                        serviceHost.Open(); 
InBlock.gif 
InBlock.gif                        ServiceHost的几个事件(顾名思义) 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 停止Windows服务 
InBlock.gif                 /// </summary> 
InBlock.gif                 protected  override  void OnStop() 
InBlock.gif                { 
InBlock.gif                         if (serviceHost !=  null
InBlock.gif                        { 
InBlock.gif                                serviceHost.Close(); 
InBlock.gif                                serviceHost =  null
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
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
InBlock.gif using System; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Data; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Web; 
InBlock.gif using System.Web.Security; 
InBlock.gif using System.Web.UI; 
InBlock.gif using System.Web.UI.HtmlControls; 
InBlock.gif using System.Web.UI.WebControls; 
InBlock.gif using System.Web.UI.WebControls.WebParts; 
InBlock.gif using System.Xml.Linq; 
InBlock.gif 
InBlock.gif public partial  class Hosting_Hello : System.Web.UI.Page 
InBlock.gif
InBlock.gif         protected  void Page_Load( object sender, EventArgs e) 
InBlock.gif        { 
InBlock.gif 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         protected  void btnSayHello_Click( object sender, EventArgs e) 
InBlock.gif        { 
InBlock.gif                var proxy =  new HostingByWindowsService.HelloClient(); 
InBlock.gif 
InBlock.gif                Page.ClientScript.RegisterStartupScript( 
InBlock.gif                         this.GetType(), 
InBlock.gif                         "js"
InBlock.gif                         string.Format( "alert('{0}')", proxy.SayHello(txtName.Text)), 
InBlock.gif                         true); 
InBlock.gif 
InBlock.gif                proxy.Close(); 
InBlock.gif        } 
InBlock.gif}
 
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
[源码下载]





     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/344113 ,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值