化零为整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"   />
    
&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
[源码下载]

你可能感兴趣的:(application)