您的位置:首页 > 移动开发

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

2008-04-07 10:04 731 查看
[索引页]
[源码下载]

[align=center]化零为整WCF(5) - 宿主Hosting(宿主在IIS, Application, WAS, WindowsService)[/align]

作者:webabcd

介绍
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
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息