WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】
前言:
由于最近的项目 中需要用到WCF,所以又回头翻了翻,阅读了大量园中大神的博文,故而做个总结。 谬误之处,万望不吝指教!
闲话不叙!
一、寄宿(Host)WCF服务
寄宿WCF服务最常用的环境是IIS或者WAS。在一个公共架构上创建,它们都提供鲁棒性进程控制和生命周期回收服务,还有一个熟悉的管理接口。当IIS架构已经在使用时这是对大多数场景来说最合适的解决方案。
然而,也有一些情况你不想在IIS或者WAS中寄宿一个服务。你可能想显式控制事件的启动和停止。或者你可能想提供一个自定义管理接口而不是使用IIS或者WAS工具。为了实现这个,你可以使用System.ServiceModel命名空间中的ServiceHost类来在任何程序中寄宿一个服务。当你做这个时,你正在使用一个自我寄宿的WCF服务。
二、自我寄宿(Self-Hosting)之 Console应用为宿主
步骤一:创建服务契约和服务
1.新建解决方案:添加WCF服务库项目。

2、为了演示,我把自动生成的接口以及实现接口的类删除,自己添加一个WCF Service

可得到一个接口以及实现它的类:

3、撰写服务函数


4、因为将原有的自动生成的接口与类删除了,故而需要将配置文件作相应的改动:

改为:

步骤二:创建服务宿主
前面介绍到,WCF服务必须寄存在某个进程中,该进程称为宿主应用程序。服务寄宿的目的就是开启一个进程来为WCF服务提供一个运行的环境。通过为服务添加一个或多个终结点,使之暴露给服务消费者使用。服务消费者再通过相应匹配的终结点对服务进行调用,下面通过创建一个控制台程序来实现WCF服务的自我寄宿方式【添加控制台应用程序,引入WcfService.Library_01的引用,添加using System.ServiceModel;库文件引用。】,具体的实现以及代码如下所示:


宿主程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WcfServiceLibrary_01;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace WCF_Console
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Me)))
{
//如果采用配置文件的方式,Region中代码就可以注释点
#region
host.AddServiceEndpoint(typeof(IMe), new WSHttpBinding(), "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary_01/Me/");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary_01/Me/metadata");
host.Description.Behaviors.Add(behavior);
}
#endregion
host.Opened += delegate
{
Console.WriteLine("Me 已经启动, 按任意键终止服务!");
};
host.Open();
Console.Read();
}
}
}
}
此时宿主已经建立完成,即服务端工作已经结束!
WCF服务寄宿通过ServiceHost对象来完成的。在上面代码中,WCF实例是通过基于WCF服务的类型(typeof(Me))来创建的,并通过AddServiceEndpoint添加了一个终结点,具体终结点的地址为http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary_01/Me,采用的绑定(Binding)类型为WSHttpBinding,并指定了服务契约的类型为IHelloWorld。
WCF是SOA的实现,而SOA的一个基本特征是松耦合,WCF应用中客户端和服务端的松耦合体现在客户端只需了解WCF服务基本的描述,而无需知道具体的实现细节就可以实现对服务的访问。WCF服务的描述通过元数据的形式进行发布的。而WCF元数据的发布是通过一个服务行为ServiceMetadataBehavior来实现的。在上面代码中,我们为创建的ServiceHost对象添加了ServiceMetadataBehavior,并采用了基于Http-GET的元数据获取方式,元数据的发布地址指定为http://127.0.0.1:8888/HelloWorldService/metadata。在调用ServiceHost的Open方法对服务成功寄宿后,你可以通过该地址获取服务相关的元数据,就如Web 服务中通过输入WSDL地址来获得Web服务的描述一样。当我们成功运行ConsoleAppHosting宿主应用程序后,在浏览器中输入
http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary_01/Me/metadata这个地址,你将得到如下所示的服务元数据。

注意宿主程序中的以下程序可被配置文件代替;而在进行真正的WCF应用开发时,都不会直接通过硬编码的方式进行终结点的添加和服务行为的定义,而是通过配置文件的方式来进行的:


特别注意!!在运行宿主应用程序时,一定以管理员权限运行宿主应用程序!!!
步骤三:创建客户端(引用服务,验证上面创建的服务)
服务成功寄宿之后,服务端便开始了服务调用请求的监听工作。另外,服务寄宿将服务描述通过元数据的方式发布出来,相应的客户端就可以获取这些元数据来创建客户端程序来对服务进行调用。在Visual Studio下,当我们添加服务引用时,VS在内部会帮我们实现元数据的获取,并通过代码生成工具(SvcUtil.exe)将这些元数据自动生成用于服务调用的服务代理相关的代码和相应的配置。
在成功运行服务寄宿程序后,右键客户端项目,在弹出的菜单中选择“添加服务引用”,然后在弹出的添加服务引用窗口中输入服务元数据的地址:http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary_01/Me/metadata,并指定一个命名空间,点击确定按钮(具体效果如下图所示),VS将为你生成用于服务调用的代理类代码和配置信息。【注意输入服务元数据地址时需要保证宿主应用程序是开启的】


添加成功之后,我们可以通过创建服务代理类对象来对服务相应方法进行调用操作,客户端进行服务调用的具体实现代码如下所示:

运行,可以得到以下结果:

【欢迎转载】
转载请表明出处: 乐学习
WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】的更多相关文章
- UE4 WCF RestFul 服务器 读取JSON 数据并解析 简单实例
Note:不知道为什么通过Txt读取的JsonString,如果TXT 不是ANSI编码的话,会报JsonArrayStringToUStruct Unable to parse. bool UWg ...
- WCF 学习总结1 -- 简单实例
从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术.WCF统一的模型整合了以往的 WebService.Remoting.MSMQ ...
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
前言: 以各种应用程序做自我寄宿的宿主原理方法大同小异,故:这儿直接上案例! 步骤一:创建服务契约和服务 1.新建解决方案:添加WCF服务库项目. 2.为了演示,我把自动生成的接口以及实现接口的类删 ...
- 创建WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为 ...
- WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为 ...
- WCF服务自我寄宿 Windows服务
WCF寄宿有自我寄宿跟IIS寄宿 服务代码: [ServiceContract] ---服务契约 public interface ICustomerService { [OperationContr ...
- wcf系列(一)--- 寄宿方式
一.自我寄宿(self-hosting) 1.wcf采用基于终结点(Endpoint)的通信手段:终结点由:地址(Address)+绑定(Binding)+契约(Contract)组成: Enpoi ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- wcf iis host 打开exe失败 不能显示界面
最近谷歌没法用了,我的freegate经常性的崩溃 无奈之下,用了必应,貌似也不错 http://stackoverflow.com/questions/8414514/iis7-does-not-s ...
随机推荐
- cobbler+koan
cobbler+koan自动重装客户机 koan是kickstart-over-a-network的缩写,它是cobbler的客户端帮助程序,koan允许你通过网络提供虚拟机,也允许你重装已经存在 ...
- jquery基础研究学习【效果】
---------------------------------分割线-------------------------------------- 2017年6月7日18:16:35Query 效果 ...
- html 自动跳转,meat(http-equiv)标签详解
http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...
- maven;tomcat配置
[说明]今天呀,上午刚刚打算写javaweb项目,服务器就出现了问题,就花了点时间搞定了:下午听老大说了任务的大致内容和意义,收获颇多:晚上去服务器上部署了maven,听说可以实现热部署 一:今天完成 ...
- Java 学习 day07
01-面向对象(继承-概述).avi package myFirstCode; /* 将学生和工人的共性描述提取出来,单独进行描述, 只要让学生和工人与单独描述的这个类有关系,就可以了. 继承: 1. ...
- 使用ILookup<TKey, TElement> 接口查找集合
public class Program { public static void Main() { // 创建一个放入ilookup数据结构的School清单. List<School> ...
- node.js版本升级
node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: npm install -g n 第二步: 升级node.js到最新稳定版 n stabl ...
- Cordova-安装Cordova过程详细解
官方网站Apache Cordova 前提是你电脑上 1:全局安装了Node 2:全局安装了npm 3:安装了java,并配置好环境 4:下载安装好android-sdk,并配好环境,注意安卓虚拟机可 ...
- C++学习笔记30,指针的引用(2)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...
- 更换好的yum源
最近重装了虚拟机,因为之前总是碰到一些 yum的软件太 旧了,索性重装了 虚拟机,从零开始,然后配置yum源,以便以后安装 插件包的时候是最新的.如下: 1,进入yum源配置目录cd /etc/yum ...