化零为整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
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的几个事件(顾名思义)
                }

                 /// <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
[源码下载]

你可能感兴趣的:(WCF,休闲,宿主,hosting,化零为整)