WCF初探-9:WCF服务承载 (下)
在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" %>
- 配置服务文件代码如下,这里我将配置两个服务一个是ServiceMessage用于Http通讯,一个是ServiceCalculator用于net.tcp通讯,如果不清楚服务配置,请参照WCF初探-6:WCF服务配置和WCF初探-7:WCF服务配置工具使用
<?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协议
- 在浏览器中重新输入http://localhost:1234/ServiceCalculator.svc,可以看到服务寄宿成功
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服务承载 (下)的更多相关文章
- WCF初探文章列表
WCF初探-1:认识WCF WCF初探-6:WCF服务配置 WCF初探-2:手动实现WCF程序 WCF初探-7:WCF服务配置工具使用 WCF初探-3:WCF消息交换模式之单向模式 WCF初探-8:W ...
- WCF初探-8:WCF服务承载 (上)
前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...
- WCF初探-10:WCF客户端调用服务
创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...
- WCF初探-11:WCF客户端异步调用服务
前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...
- WCF初探-13:WCF客户端为双工服务创建回调对象
前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...
- WCF学习心得----(四)服务承载
WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...
- WCF服务承载
WCF服务承载(笔记) 自托管(也做自承载) 承载 WCF 服务最灵活.最便捷的方法就是进行自承载.要能够自承载服务,必须满足两个条件.第一,需要 WCF 运行时:第二,需要可以承载 Servic ...
- WCF学习心得----(三)服务承载
WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...
- WCF初探-6:WCF服务配置
WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...
随机推荐
- jQuery选择器和事件
选择器 常用事件 绑定与解除绑定 事件目标与冒泡 自定义事件
- css布局之左侧固定右侧自适应布局
参考代码如下: <form id="form1" style="height:100%; overflow:hidden;"> <div st ...
- tar命令参数笔记
是指的linux下的tar命令,该命令的用法相当多,以下的内容来自tar的info手册 --numeric-owner This option will notify 'tar' thar it sh ...
- #if、#ifdef、#if defined之间的区别【转】
转自:http://quanminchaoren.iteye.com/blog/1870977 #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code. ...
- 2016 ACM/ICPC Asia Regional Dalian Online
1009 Sparse Graph(hdu5876) 由于每条边的权值都为1,所以最短路bfs就够了,只是要求转置图的最短路,所以得用两个set来维护,一个用来存储上次扩散还没访问的点,一个用来存储这 ...
- 转义字符_MySQL识别下面的转义序列
转义字符.MySQL识别下面的转义序列 在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' ...
- ContentProvider总结
一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...
- Hibernate的关联映射——双向1-N关联
Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...
- Bootstrap_下拉菜单
在使用Bootstrap框架的下拉菜单时,必须调用Bootstrap框架提供的bootstrap.js文件. 一.普通下拉菜单 <div class="dropdown"&g ...
- Exception&Error
Java异常处理 1:什么是异常 异常(Exception)也叫异常.在Java编程语言中,异常就是程序在运行过程中由于硬件设备问题.软件设计错误.缺陷等导致的程序错误. 1.1:想打开的文件不存在 ...