aaahd 发表于 2015-8-12 11:07:12

化零为整WCF(5)

[索引页]
[源码下载]



化零为整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>
   
    public interface IHello
    {
      /**//// <summary>
      /// 打招呼方法
      /// </summary>
      /// <param name="name">人名</param>
      /// <returns></returns>
      
      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>
   
    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";
            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" />
    &nbsp;
    <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
[源码下载]
页: [1]
查看完整版本: 化零为整WCF(5)