1:写在前面

我们都知道WCF在运行的时候必须自己提供宿主来承载服务。WCF 本身没有附带宿主,而是提供了一个 ServiceHost 的类,该类允许您在自己的应用程序中host WCF 服务。然后调用 ServiceHost 的 Open 方法即可。我们知道WCF是针对SOA的一套技术.对于SOA而言,我们必须确保服务能够正常运行,平稳的运行,所以此时如何host我们的服务,用什么来Host我们的服务是很重要的,所以我们要为我们的应用程序选择一个合适的Host方式是很有必要的.

2:常见的几种Host

使用Visual Studio.NET可以创建以下几种不同类型的托管应用程序:

WinForms 应用程序

控制台应用程序

Windows 服务

承载于 Internet 信息服务 (IIS) 中的 Web 应用程序

下面我会以一个Demo为例,来介绍这几种常用的host.

3:Hoster特征

在选择应用程序类型时,必须考虑某些特定要求.ServiceHost 必须被实例化才能提供运行服务所需的承载环境。控制台应用程序和 WinForms 应用程序通常运行在用户桌面计算机上。在桌面上是可见的,它们可以承载您的服务,安全性较差.因此并不适用于企业的宿主。因为我们要让我们的企业服务能够支持更大更多的服务,在使用控制台应用程序和 WinForms 应用程序作为host的时候,显然不适合,在这种体系结构中,。这些适用于企业的宿主通常能够满足诸如高可用性的要求。因此,我们不能将控制台或 WinForms 应用程序做为适用于企业的宿主。唯一可行的就是在 IIS 上承载服务或将其Host到Windows 服务。事实上在项目开发过程中我们一般都用windows applicatin或console application做为host.这样有利于调试和测试,而在项目部署的时候,我们一般会选择IIS或windows service作为host. IIS有很多优点,他本身提供了很多功能,

4:Soultion结构图

在这个Soultion主要介绍了Console Applicatin,Windows service,IIS三种Host,因为Windows Application和Console Application没有多大区别,暂不作介绍

首先我们介绍在Windows Services中Host WCF service.Windows service 是由操作系统管理的进程,在.net环境中已经提供了这样的模板,以Windows services作为host是一个很不错的选择:

Windows services Host对应用solution中的WCFWindowsServicesHost.

Services Contract和Services

[ServiceContract]
public interface ITest
{
    [OperationContract]
    double add(double x, double y);
}

public class Test:ITest
{

public double add(double x, double y)
      {
          return x + y;
      }

}

5:Windows services Host

首先我们建立一个windows service 项目.

windows services项目中包含两个文件:service1.cs 文件和 program.cs 文件。其中 service1.cs 文件包含服务实现,而 program.cs 文件则用于实例化并实质上承载 Windows 服务。要在 Windows 服务内部承载 WCF 服务,只需执行 Windows service的 Start() 方法和 Stop() 方法

ServiceHost host;
      public WindowServiceTest()
      {
          InitializeComponent();
      }

protected override void OnStart(string[] args)
      {
          host = new ServiceHost(typeof(Test));
          host.Open();          
      }

protected override void OnStop()
      {
          host.Close();
      }
  配置文件:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors >
      <behavior name="ConsoleApplicationHost">
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="basicBinding"></binding>
    </basicHttpBinding>
  </bindings> 
  <services>
    <service name="WCFHostServices.Test">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="WCFHostContract.ITest" behaviorConfiguration="ConsoleApplicationHost">
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost/WindowsServiceTest"/>
        </baseAddresses>
      </host>
    </service>
  </services>    
</system.serviceModel>

事实我们可以看到编写host在windows services上的WCF服务很简单,windows services固然有很多好处,比如说随操作系统一起启动,无须人为的开启,而且不限定你的绑定技术,话说windows service 有这么多好处,当然也有不好的地方,比如安装windows service.我们必须通过Installutil.exe 工具或通过安装包中的自定义操作来安装服务。这个工具在安装SDK后会自带的,InstallUtil的使用也很简单,下面我们以自定义安装服务为例

在 Windows 服务项目中打开 Service 类的设计器视图。在右击窗口中,单击“添加安装程序”,这样我们就会添加了一个名为ProjectInstaller的组件,在项目中双击这个文件,有一个servicesinstall1的组件,我们右击可以修改他的名字,起动类型等,

为了创建安装 Windows 服务的安装程序,我们需要向solution中添加安装程序和部署项目(windowsserviceSetup)。以下步骤描述了如何向解决方案添加安装程序和部署项目:

新建一个安装项目:

1:右键单击安装项目,指向“添加”,然后选择“项目输出”,选择windows service appliation...选择主输出,

2:右键单击安装项目,指向 view->custome action.

3:右击Customer action,将主输出的文件加入custome action中

4:生成项目,并安装,这样我们就可以启动我们的servcies里.我们可以打开windows services管理工具查看我们安装后的servcie

6:IIS Host

若要在 IIS 中host WCF Services,需要有一个扩展名为 .svc 的文件。事实上在我们项目模板中已经提供了这样的模板.该文件将服务与其实现相关联,并且是 IIS 自动创建 ServiceHost 的手段。IIS 将接管服务与 ServiceHost 之间的交互,不必再由您自己实例化和启动 ServiceHost。.svc 文件的第一行包含一条夹在 ASP.NET <% Page %> 指令内的指令,用于指示文件指向哪个服务。在 IIS 中承载 WCF 服务的默认行为是该 IIS 控制 ServiceHost 的实例化。

我们可以建立一个WCF Services Application,这个文件会自动生Service.svc的文件.

我们也可以在其他项目模板中添加svc文件:

<%@ ServiceHost Language="C#" Debug="true" Service="WCFIISHost.Test" CodeBehind="Test.svc.cs" %>

在 IIS 中进行host意味着您必须在应用程序的 Web.config 文件中设置 WCF 配置。Web.config 如下

<system.serviceModel>
  <services>
    <service behaviorConfiguration="WCFIISHost.Service1Behavior"
      name="WCFIISHost.Test">
      <endpoint address="" binding="wsHttpBinding" contract="WCFIISHost.ITest">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="WCFIISHost.Service1Behavior">
        <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
        <serviceMetadata httpGetEnabled="true"/>
        <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

在 IIS 中host WCF services的默认行为是该 IIS 控制 ServiceHost 的实例化。在Client端我们直接引用地址,默认会在我们的客户端生成代理文件,无须我们使用svcutil工具来生成客户端的代理.

注意:endpoint的address应该为空,以就是说svc 文件将会确定服务的 base 地址

7:Console Application Host

这种方法再简单不过了,因为大多数时候在测试项目的时候,我们都会用这样的host,

Config:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors >
      <behavior name="ConsoleApplicationHost">
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="basicBinding"></binding>
    </basicHttpBinding>
  </bindings> 
  <services>
    <service name="WCFHostServices.Test">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="WCFHostContract.ITest" behaviorConfiguration="ConsoleApplicationHost">
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost/ConsoleTest"/>
        </baseAddresses>
      </host>
    </service>
  </services>    
</system.serviceModel>

启动Host:

using (ServiceHost host = new ServiceHost(typeof(Test)))
           {
               host.Open();
               Console.WriteLine("Services has begun listenting");
               Console.ReadKey();
           }

Client:

public class CoClient : ClientBase<WCFHostContract.ITest>, ITest
{
    public double add(double x, double y)
    {
        return this.Channel.add(x, y);
    }
}

WCF中常见的几种Host,承载WCF服务的方法的更多相关文章

  1. ORACLE中常见的几种锁

    ORACLE中常见的几种锁: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4 ...

  2. Java中常见的5种WEB服务器介绍

    这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...

  3. Vue基础01vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令

    自学vue框架,每天记录重要的知识点,与大家分享!有不足之处,希望大家指正. 本篇将讲述:vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令 前期学习基础,使用vue. ...

  4. JS中常见的几种报错类型

    1.SyntaxError(语法错误) 解析代码时发生的语法错误 var 1a; //Uncaught SyntaxError: Invalid or unexpected token 变量名错误 c ...

  5. PHP中常见的五种设计模式

    设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为.实际上,设计模式对于每个人都非常有用.如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非 ...

  6. java中常见的几种Runtimeexception

    转自http://blog.csdn.net/qq635785620/article/details/7781026 一般面试中java Exception(runtimeException )是必会 ...

  7. 十五天精通WCF——第十二天 说说wcf中的那几种序列化

    我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...

  8. C++中常见的几种异常类型

    1.C++具有完善的异常捕获机制,采用try{}  catch(){}机制,这是C语言无法比拟的 2.常见的几种异常: bad_alloc:       请求分配内存失败, operator new ...

  9. 说出JQuery中常见的几种函数以及他们的含义是什么?

    jQuery中常见的函数如下:  (1)get()取得所有匹配的DOM元素集合. (2)get(index)取得其中一个匹配的元素.index表示取得第几个匹配的元素. (3)append(conte ...

随机推荐

  1. wireshark使用教程

    Wireshark: https://www.wireshark.org/ 安装: apt-get install wireshark 教程: http://blog.csdn.net/leichel ...

  2. hdu 4521 小明系列问题——小明序列(线段树 or DP)

    题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...

  3. NYOJ 298 点的变换

    题目链接:298 点的变换 这题放在矩阵快速幂里,我一开始想不透它是怎么和矩阵搭上边的,然后写了个暴力的果然超时,上网看了题解后,发现竟然能够构造一些精巧的矩阵来处理,不得不说实在太强大了! http ...

  4. iOS开发 UIPanGestureRecognizer手势抽象类

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@sel ...

  5. dedecms5.7怎么取消邮箱验证以及dedecms 会员发布的文章不需要审核的解决方法

    后台 ——系统基本参数——会员设置——会员权限开通状态——改为0 1.实现会员发布文章不需要审核,非会员发布需要审核 在member这个文件夹下找到archives_sg_add.php这个文件,打开 ...

  6. tcp服务的测试程序开源

    开源的是一个测试客户端,可以用来检验服务器端程序的并发处理能力. 使用方法为: python epolltest.py --host=192.168.15.128 --port=8809 --degr ...

  7. 【转】实现RTP协议的H.264视频传输系统

    1.  引言       随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动 ...

  8. 鸟哥的linux私房菜勘误表

    博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://ww ...

  9. jmeter 监听的介绍

    一个侦听器是一个组件,显示的结果 样本. 结果可以显示在一个树,表格,图表或简单地写入到日志中 文件. 查看的内容反应任何给定的采样器,添加的监听器” 视图 结果树 ”或“ 视图的结果表 一个测试计划 ...

  10. python 练习 29

    Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建: v ...