[源码下载]
化零为整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);
}
}
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;
}
}
}
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;
}
}
}
}
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>
<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>
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();
}
}
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>
<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
[源码下载]