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 ...
随机推荐
- KeyboardJS 开发指南 - 与 Three.js 配合使用的捕捉键盘组合键库
KeyboardJS 开发指南 - 与 Three.js 配合使用的捕捉键盘组合键库 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非 ...
- sql生成器(含凝视)问题修复版
接上篇http://blog.csdn.net/panliuwen/article/details/47406455 sql生成器--生成含凝视的sql语句 今天我使用自己写的sql生成器了.自我感觉 ...
- 获取unity prefab的预览图像
官方的api可以直接获取预览图像,如下所示: Tex=AssetPreview.GetAssetPreview(Object m)as Texture; 但是如果prefab是组合体的话(即一个pre ...
- 创建有提示的ui组件
using UnityEditor; using UnityEngine; using System.Collections; using Edelweiss.CloudSystem; namespa ...
- 第三方-Swift2.0后Alamofire的使用方法
第一部分,配置项目 首先我们创建一个工程如下图 在此只讲纯手打拉第三方框架的方法 然后把下载的Alamofire解压文件全部放进创建的项目文件夹中,如下图 关键时刻到了哦,集中精神,注意!!! 这个图 ...
- jquery基础研究学习【HTML】
jQuery HTMLjQuery 捕获jQuery 设置jQuery 添加元素jQuery 删除元素jQuery CSS 类jQuery css() 方法jQuery 尺寸 笔记:
- ios开发:如何用js调用ios
本文转载至 :http://blog.chinaunix.net/uid-29415710-id-4058564.html - (BOOL)webView:(UIWebView *)webView s ...
- idangerous swiper
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...
- openssl将私钥和crt证书合成pfx证书
pfx是什么文件:公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥.公钥和证书指定了一个可移植的格式.它 ...
- 我的Android进阶之旅------>android中getLocationInWindow 和 getLocationOnScreen的区别
View.getLocationInWindow(int[] location) 一个控件在其父窗口中的坐标位置 View.getLocationOnScreen(int[] location) 一个 ...