WCF初探-8:WCF服务承载 (上)中,我们对宿主的概念、环境、特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍。为了更好的说明各寄宿环境特点,本实例采用Http和net.tcp两种服务通讯方式,同时寄宿在不同的宿主中。程序结构如下:

服务契约的接口和实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel; namespace Service
{
[ServiceContract]
public interface IServiceCalculator
{
[OperationContract]
double Add(double n1, double n2);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel; namespace Service
{
[ServiceContract]
public interface IServiceMessage
{
[OperationContract]
string ReturnMessage();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Service
{
public class ServiceCalculator:IServiceCalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Service
{
public class ServiceMessage:IServiceMessage
{
public string ReturnMessage()
{
return "调用服务计算结果如下";
}
}
}

IIS 中承载 WCF 服务和WAS 中承载 WCF 服务

  1.  完成IISHost代码

  • 引用Service程序集
  • 添加ServiceCalculator.svc新文件,代码如下
<%@ ServiceHost Language="C#" Debug="true"  Service="Service.ServiceCalculator" %>
  • 添加ServiceCalculator.svc新文件,代码如下
<%@ ServiceHost Language="C#" Debug="true" Service="Service.ServiceMessage" %>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
<endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service> <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services> <bindings>
<netTcpBinding>
<binding name="PortSharingBinding" portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
</configuration>

  2.  寄宿服务

  • 生成IISHost程序,将bin文件目录、ServiceCalculator.svc、ServiceMessage.svc、Web.config拷贝到新建的WCFHost文件夹中
  • 新建网站配置该程序以便承载服务。
  • 点击IIS菜单的应用程序池,找到WCFHost程序池,将.net framework版本设置为v4.0,托管管道模式设置为集成

  • 在浏览器中输入http://localhost:1234/ServiceMessage.svc可以看到服务发布成功

  • 在浏览器中输入http://localhost:1234/ServiceCalculator.svc可以看到服务寄宿失败

  这是因为ServiceCalculator.svc启用的是net.tcp通讯,而在IIS中启用net.tcp通讯就必须依靠Windows 进程激活服务(也称为 WAS)

  • 要使用WAS寄宿程序,就需要配置几个地方

    在控制面板->程序和功能->打开或关闭windows功能勾选以下几个功能,安装WCF 激活组件

        

    配置承载服务的WCFHost网站,添加net.tcp通讯。

    

    点击网站的高级设置,在已启用的协议后追加net.tcp协议

    

  3. 客户端验证服务

  • 启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端

在托管应用程序中承载 WCF 服务

  1. 完成AppHost代码

  • 添加对service程序集的引用,配置文件App.config代码如下
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:2234/ServiceMessage/"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service> <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:1235/ServiceCalculator/"/>
<add baseAddress="net.tcp://localhost:1234/ServiceCalculator"/>
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" >
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services> <bindings>
<netTcpBinding>
<binding name="PortSharingBinding" portSharingEnabled="true" >
<security mode="None" />
</binding>
</netTcpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
</configuration>
  • Program.cs代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service;
using System.ServiceModel; namespace AppHost
{
class Program
{
static void Main(string[] args)
{
try
{
ServiceHost MessageHost = new ServiceHost(typeof(ServiceMessage));
ServiceHost CalculatorHost = new ServiceHost(typeof(ServiceCalculator)); MessageHost.Open();
CalculatorHost.Open();
Console.WriteLine("服务已经启动。。。");
Console.ReadLine();
MessageHost.Close();
CalculatorHost.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.Read();
} }
}
}

  2.  寄宿服务

  • 生成AppHost工程,找到bin目录下的AppHost.exe,点击运行,查看到服务寄宿成功

  3.  客户端验证服务

  • 启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端。分别添加服务地址:

    http://localhost:2234/ServiceMessage/

    http://localhost:1235/ServiceCalculator/

  

在托管 Windows 服务中承载 WCF 服务  

  1.  完成NTHost代码

  • 添加windows服务程序services1.cs,在设计界面上单击右键添加安装程序ProjectInstaller.cs,在ProjectInstaller.cs设计界面上有serviceProcessInstaller1和serviceInstaller1两个安装组件,分别设置他们的属性
  • 添加配置文件App.config代码,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:2234/ServiceMessage/"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service> <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:1235/ServiceCalculator/"/>
<add baseAddress="net.tcp://localhost:1234/ServiceCalculator"/>
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" >
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services> <bindings>
<netTcpBinding>
<binding name="PortSharingBinding" portSharingEnabled="true" >
<security mode="None" />
</binding>
</netTcpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
</configuration>
  • Service1.cs代码如下:
using System.ServiceProcess;
using Service;
using System.ServiceModel; namespace NTHost
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
} ServiceHost MessageHost = null;
ServiceHost CalculatorHost = null; protected override void OnStart(string[] args)
{
MessageHost = new ServiceHost(typeof(ServiceMessage));
CalculatorHost = new ServiceHost(typeof(ServiceCalculator)); MessageHost.Open();
CalculatorHost.Open();
} protected override void OnStop()
{
MessageHost.Close();
CalculatorHost.Close(); MessageHost = null;
CalculatorHost = null;
}
}
}

  2.  寄宿服务

  • 生成NTHost工程,安装windows服务程序NTHost.exe,在命令行中输入

  Cd C:\Windows\Microsoft.NET\Framework\v4.0.30319,回车后输入installutil.exe 程序生成的bin目录绝对地址\NTHost.exe –i,回车后安装服务程序,程序注册成功后启动服务。

在开始菜单输入services.msc命令,打开服务管理程序将NTServiceHost服务设置为启动

  

  3.  客户端验证服务

  •  启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端。分别添加服务地址:

    http://localhost:2234/ServiceMessage/

    http://localhost:1235/ServiceCalculator/

  

  

WCF初探-9:WCF服务承载 (下)的更多相关文章

  1. WCF初探文章列表

    WCF初探-1:认识WCF WCF初探-6:WCF服务配置 WCF初探-2:手动实现WCF程序 WCF初探-7:WCF服务配置工具使用 WCF初探-3:WCF消息交换模式之单向模式 WCF初探-8:W ...

  2. WCF初探-8:WCF服务承载 (上)

    前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...

  3. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  4. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  5. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

  6. WCF学习心得----(四)服务承载

    WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  7. WCF服务承载

    WCF服务承载(笔记)   自托管(也做自承载) 承载 WCF 服务最灵活.最便捷的方法就是进行自承载.要能够自承载服务,必须满足两个条件.第一,需要 WCF 运行时:第二,需要可以承载 Servic ...

  8. WCF学习心得----(三)服务承载

    WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  9. WCF初探-6:WCF服务配置

    WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...

随机推荐

  1. ACM Coder [T1002] 一直wrong answer,不知道为什么。上代码!就对就对!

    忘了改了什么,后来居然对了!做打不死的菜鸟! #include <stdio.h> #include <stdbool.h> #define arrayLength 20 #d ...

  2. google bookmarket api

    引用: 最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在andr ...

  3. Visual Studio C#的winform/webform/asp.net控件命名规范

    控件命名规范 类型 前缀 示例 AdRotator adrt adrtTopAd Button btn btnSubmit Calendar cal calMettingDates CheckBox ...

  4. 导入maven工程遇见的问题【问题】

    原工程是一个基于websocket的maven工程(源工程:http://www.cnblogs.com/xdp-gacl/p/5193279.html),把工程导入eclipse后报错.

  5. Hadoop之为何不使用RAID?

    一.引言: 在一次和同事的讨论中遇到一个这样的问题:有一个hadoop集群,在hbase的put数据出现瓶颈,他们想要把datanode上的磁盘做成RAID 0(比如10块磁盘做成一个RAID 0), ...

  6. CentOS install GCC-4.8.5

    1. 下载源码:http://ftp.gnu.org/gnu/gcc 2. cd gcc-4.8.5 ./contrib/download_prerequisites       //下载资源包 3. ...

  7. 如何使用R语言解决可恶的脏数据

    转自:http://shujuren.org/article/45.html 在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模.挖掘等工作造成严重的错误,所以必须谨慎的处理那 ...

  8. jQuery判断当前元素是第几个元素

    $("ul li").click(function () { var index = $("ul li").index(this); alert(index); ...

  9. ArrayList代码示例

    package com.shushine.framework.第七章Java标准类库;import java.util.ArrayList;/** * * <p> * 描述该类情况 {@l ...

  10. 从ASP了解Http Buffer

    he Buffer property specifies whether to buffer the output or not. When the output is buffered, the s ...