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

这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决。所以在这一章节中,有一个承载是没有例子的。仍在努力解决所在的问题,后续会把例子给补上的。好了,进入正题。

要变为活动状态,服务必须承载于创建它并控制它的上下文和生存周期的运行环境中。WCF有以下三种承载方式:在IIS中承载、在Windows进程激活(WAS)中承载、在托管应用程序中承载(自承载)。下面就分别对这三种承载方式,一一介绍。

1.    在IIS中承载

1.1     概述

WCF可以方便的通过IIS承载,此承载模型与ASP.NET和ASP.NET Web Service使用的模型类似,都是通过HTTP协议进行激活和网络通信的。

WCF可以在Windows XP SP2上的IIS5.1、Windows Server2003上的IIS 6.0、Windows 7和Windows Server 2008的IIS 7.0上承载。

1.2     优点

1) 可以向处理其他任何类型的IIS应用程序一样,部署和管理IIS中承载的WCF服务。

2) IIS提供进程激活、运行状态管理和回收功能以提高承载的应用程序的可靠性。

3) ASP.NET一样,ASP.NET中承载的WCF服务可以利用ASP.NET共享宿主模型,在此模型中,多个应用程序驻留在一个公共辅助进程中以提高服务器密度和可伸缩性。

4) IIS中承载的WCF服务与ASP.NET2.0使用相同的动态编译模型,该模型简化了承载服务的开发和部署。

5)  IIS承载WCF服务时,IIS5.1IIS6.0仅限于HTTP通信。

1.3      部署IIS承载WCF服务示例

1.3.1 确保正确安装和注册IIS、WCF、WCF HTTP激活组件。

方法如下:控制面板—>所有面板项—>程序和功能—>打开或关闭Windows功能—>

将如上图所示的项勾选即可。

当然除了在打开或关闭Windows功能面板里边勾选之外,我们还可以通过命令在dos窗口里激活组件,由于操作起来不如直接在windows功能里勾选方便,所以这里就不再列出相应的激活命令了,有兴趣的朋友可以下去自己在网上搜一下。

1.3.2 具体代码演示

1.3.2.1 新建WCFService客户端,WCF服务程序
1.3.2.1.1目录结构如下:

1.3.2.1.2 在ICalculatorService.cs中代码如下,该文件主要用来定制服务的协定
[ServiceContract(Namespace=”WCFService”)]
public interface ICalculatorService
{
[OperationContract] double Add(double n1, double n2); [OperationContract]
double Subtract(double n1, double n2); [OperationContract]
double Mutiply(double n1, double n2); [OperationContract]
double Devide(double n1, double n2);
}
1.3.2.1.3 CalculatorService.svc.cs文件中代码如下,该文件主要实现了服务定制的接口
public class CalculatorService : ICalculatorService

    {
public double Add(double n1, double n2)
{
return n1 + n2;
} public double Subtract(double n1, double n2)
{
return n1 - n2;
} public double Mutiply(double n1, double n2)
{
return n1 * n2;
} public double Devide(double n1, double n2)
{
return n1 / n2;
}
}
1.3.2.1.4  Web.config文件中代码如下,该文件主要定制服务的配置
<?xml version="1.0" encoding="utf-8"?>

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
//配置服务
<service name="WCFService.CalculatorService" behaviorConfiguration="CalculatorServiceBeheavior">
//配置服务的根节点
<endpoint address=""
binding="wsHttpBinding"
contract="WCFService.ICalculatorService"/>
//配置元数据的根节点
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
//配置服务的行为,允许获取元数据
<behavior name="CalculatorServiceBeheavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
1.3.2.2 在IIS中创建网站,将该服务端生成的如下图红框圈住的文件拷贝至网站虚拟目录对应的物理路径下

然后发布在浏览器中观看如下图:

这时还需要留意,浏览器中的url,如下:

1.3.2.3 使用Svcutil.exe工具生成客户端调用类和配置文件
1.3.2.3.1打开命令行提示符工具,输入一下命令,将目录定位到Svcutil.exe所在的目录。

Svcutil.exe目录一般位于C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin文件夹下,所以命令如下:

Cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\

1.3.2.3.2 定位到该文件下之后,继续键入以下命令:

Svcutil.exe  /out:D:\CalculatorClient.cs  /config:\D:App.config

http://localhost:116/CalculatorService.svc

备注:

Svcutil工具生成客户端使用类有固定的语法参数,下面仅列出了该文所需的一些参数,至于其他的参数以后可能还会涉及到,有兴趣的话可以去msdn上了解一些。

1)       “/out:”后跟生成文件的存放路径+文件名+.cs

2)       “/config:”后跟生成文件的存放路径+app.config

3)       http://....  为服务的地址,承载服务的应用程序运行起来时,Svcutil.exe通过该服务地址,生成下载客户段使用类,该地址跟配置文件中的<host>节点下的地址是一致的。

1.3.2.4 新建WCF客户端应用程序
1.3.2.4.1将1.3.2.3.中生成的CalculatorClient.cs文件和App.config文件添加到项目中

项目结构图如下:

1.3.2.4.2  在Program.cs文件中使用客户端调用类,调用服务端的服务

代码如下:

class Program
{
static void Main(string[] args)
{
CalculatorServiceClient calculatorClient = new CalculatorServiceClient(); Console.WriteLine("{0}+{1}={2}", 1.2, 2.3, calculatorClient.Add(1.2, 2.3));
Console.WriteLine("{0}-{1}={2}", 2.3, 3.4, calculatorClient.Subtract(2.3, 3.4));
Console.WriteLine("{0}*{1}={2}", 3.4, 4.5, calculatorClient.Mutiply(3.4, 4.5));
Console.WriteLine("{0}/{1}={2}", 4.5, 3.0, calculatorClient.Devide(4.5, 3.0)); Console.WriteLine("OK! That's all!");
Console.Read();
}
}

1.3.2.5 运行客户端程序WCFClient

效果如图:

2.在Windows进程激活服务(WAS)中承载

2.1 概述

Windows进程激活服务(WAS)管理辅助进程的激活和生存周期,该辅助进程包含WCF服务的应用程序。WAS进程模型通过移除对HTTP的依赖性使HTTP服务器的IIS6.0进程模型通用化,允许WCF服务在宿主环境中同时使用HTTP和非HTTP协议(例:NET.TCP),该宿主环境支持基于消息的激活并提供在给定计算机上承载大量应用程序的能力。

2.2 优点

1)  基于消息的应用程序激活和辅助进程应用程序会动态的启动和停止,以响应使用HTTP和非HTTP网络协议送达的传入工作项

2)  可靠的应用程序和辅助进程回收可以使应用程序保持良好的运行状况

3)  集中的应用程序配置和管理

4)  允许应用程序利用IIS进程模型,而无需完全IIS安装部署的需求量。

2.3 WA中承载WCF服务示例

2.3.1 确保正确的安装了所需的WCF激活组件

方法如下:方法如下:控制面板—>所有面板项—>程序和功能—>打开或关闭Windows功能—>

将如上图所示的项勾选即可。另有通过命令激活的方法,这里不作详解。

2.3.2 代码演示

略(待续)

3.在托管的应用程序中承载(自承载)

3.1 概述

服务可以承载于任何.NET Framework应用程序中。

自承载服务时最灵活的宿主选项,因为此服务部署所需要的基础结构最少,但是该服务也是最不可靠的宿主选项。

3.2 优点

服务部署所需基础结构最少,是最为灵活的宿主选项

3.3 在托管的应用程序中承载WCF服务示例

3.3.1 新建控制台应用程序命名为ZWCFService,作为服务的承载程序,主要的目录结构如下:

具体的编码实现如下,编码实现之后要确保该程序运行起来,这样才能够获取到该服务

3.3.1.1 在Program.cs中编码如下:

   

class Program
{
static void Main(string[] args)
{
using(ServiceHost serviceHost=new ServiceHost (typeof(CalculatorService)))
{
serviceHost.Open(); Console.WriteLine("This service is ok!");
Console.WriteLine("Press any key to teiminate the service!");
Console.WriteLine();
Console.Read();
}
}
}
[ServiceContract(Namespace="http://ZWCFService")]
public interface ICalculatorService
{
[OperationContract]
double Add(double n1, double n2); [OperationContract]
double Subtract(double n1, double n2); [OperationContract]
double Mutiply(double n1, double n2); [OperationContract]
double Devide(double n1, double n2);
} public class CalculatorService : ICalculatorService
{
public double Add(double n1, double n2)
{ double result = n1 + n2; Console.WriteLine("{0}+{1}={2}", n1, n2, result); return result; } public double Subtract(double n1, double n2)
{ double result = n1 - n2; Console.WriteLine("{0}-{1}={2}", n1, n2, result); return result; } public double Mutiply(double n1, double n2)
{
double result = n1 * n2; Console.WriteLine("{0}*{1}={2}", n1, n2, result); return result;
} public double Devide(double n1, double n2)
{
double result = n1 / n2; Console.WriteLine("{0}/{1}={2}", n1, n2, result); return result;
}
}
3.3.1.2 App.config配置文件中代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="ZWCFService.CalculatorService" behaviorConfiguration="CalculatorServiceBeheavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ZWCFService/CalculatorService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="ZWCFService.ICalculatorService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBeheavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

3.3.2 使用Svcutil.exe工具生成CalculatorClinet类文件和app配置文件

3.3.2.1 打开命令行提示符工具,输入一下命令,将目录定位到Svcutil.exe所在的目录。

Svcutil.exe目录一般位于C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin文件夹下,所以命令如下:

Cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\

3.3.2.2 定位到该文件下之后,继续键入以下命令:

Svcutil.exe  /out:C:\CalculatorClient.cs  /config:\C:App.config

http://localhost:8000/ZWCFService/CalculatorService

备注:

Svcutil工具生成客户端使用类有固定的语法参数,下面仅列出了该文所需的一些参数,至于其他的参数以后可能还会涉及到,有兴趣的话可以去msdn上了解一些。

1)       “/out:”后跟生成文件的存放路径+文件名+.cs

2)       “/config:”后跟生成文件的存放路径+app.config

3)       http://....  为服务的地址,承载服务的应用程序运行起来时,Svcutil.exe通过该服务地址,生成下载客户段使用类,该地址跟配置文件中的<host>节点下的地址是一致的。

3.3.3 新建一个名为ZCWFServiceClient客户端应用程序(控制台或winform应用程序均可)

3.3.3.1 将3.3.2中生成的客户端使用类和配置文件,添加到当前项目中

客户端项目的目录结构如下:

3.3.3.2 在Program.cs文件中编码如下,调用服务的方法

class Program
{
static void Main(string[] args)
{
CalculatorServiceClient calculator = new CalculatorServiceClient(); Console.WriteLine("{0}+{1}={2}",1.2,2,3,calculator.Add(1.2, 2.3));
Console.WriteLine("{0}-{1}={2}",3.4,2.3,calculator.Subtract(3.4, 2.3));
Console.WriteLine("{0}*{1}={2}",4.5,3.4,calculator.Mutiply(4.5, 3.4));
Console.WriteLine("{0}/{1}={2}",5.6,4.0,calculator.Devide(5.6, 4.0)); Console.WriteLine("Operation Over");
Console.WriteLine("Press any key to terminate the Console");
Console.Read();
}
}

3.3.4 运行调试

3.3.4.1 先启动服务端程序ZWCFService

结果如下:

3.3.4.2 再启动客户端程序

如果客户端和服务端程序在同一个解决方案中,可将服务端设置为启动项,待服务端启动后,可以点击客户端右键—>调试-->启动新示例

用这样的方法来启动客户端,结果如下:

WCF学习心得----(四)服务承载的更多相关文章

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

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

  2. WCF学习心得----(五)生成客户端

    WCF学习心得----(五)生成客户端 1.    通过Svcutil.exe工具直接生成客户端 1.1     将服务承载于IIS上 1.1.1 在IIS中新建网站,所示效果如下图: 1.1.2   ...

  3. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  4. WCF学习心得------(六)数据协定

    --前言 最近各种事忙的把之前的WCF学习给耽误了一些,今天抽时间把之前的学习内容给总结了一下,因为知识点比较细碎没有做太多的练习示例,只是对其中关键的知识点做了总结,希望可以对大家有所帮助. 第六章 ...

  5. WCF学习心得

    之前很经常听说WCF,不过没有怎么接触过,直到最近才真正使用到WCF,虽然也只是皮毛而已,在此也做个记录总结吧. 下图是我使用WCF的练手项目,由于是使用VS2010直接创建的WCF服务应用程序,VS ...

  6. WCF学习心得------(三)配置服务

    配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...

  7. WCF学习心得------(二)设计和实现服务协定

    设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...

  8. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  9. WCF学习心得------(七)消息协定

    第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...

随机推荐

  1. 转:设置session过期时间

    在Asp.net应用中,很多人会遇到Session过期设置有冲突.其中,可以有四处设置Session的过期时间: 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会 ...

  2. php-抽象

    //继承//子类可以继承父类的一切//特点:单继承//函数的重写 //多态//当父类引用指向子类实例,由于子类对父类的方法进行了重写,父类引用在调用该方法的时候表现出的不同//如果一个方法需要一个父类 ...

  3. 初识mySQL(关系型数据库)

    一.数据库修改密码 ①先执行use mysql; ②再执行update  mysql.user  set  password=PASSWORD(要修改的密码) where  user='root' ; ...

  4. vs2013常用快捷键收集

    vs2013快捷键: 复制一整行代码: Ctrl+C剪切一整行代码: Ctrl+X删除一整行代码: Ctrl+L跳转到指定的行:ctrl+G 注释:组合键“Ctrl+K+C”取消注释:组合键“Ctrl ...

  5. cocos2d-html5 sprite打印宽高都为0的问题

    版本是2.1.4,在程序里直接通过图片路径addChild了一个cc.Sprite,想要缩放时通是不起做用,于是通过打印发现其宽,高都为0,查来查去,发现:原来是图片没有注册到Resource.js里 ...

  6. SpringMVC 产品笔记

    假设我是springMVC的产品经理,我会怎么做? 恩,题目太大,能力不够,缓一缓. http://jinnianshilongnian.iteye.com/category/231099 http: ...

  7. iOS学习笔记---oc语言第一天

    第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++  java   ...

  8. 简述HP iLO中的几种开关机选项

    ILO是intergrated Light-Out的缩写,是HP的远程管理功能,它可以实现远程开关机.远程安装.远程连接等功能. 笔者刚接触HP服务器时对四个关于开关机的选项非常困惑,不明其中区别.此 ...

  9. 101. Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  10. 图像处理之face morphing

    以前在论坛.微博经常看到一张脸,五官长得像A,脸型似乎又是B,觉得很有意思. 比如像这张图片.这张图片应该是网友用Photoshop完成的,他们取了郭大爷的五官,放在金元帅的脸上,在把边缘处理平滑. ...