WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点
示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务。而关于终结点的配置我们都是通过配置文件来完成的。在本讲中,我们将直接使用编程方式来配置终结点。
ServiceHost类
即服务宿主类,它为我们的服务提供一个运行环境。ServiceHost的构造函数有三个重载:
ServiceHost() 使用无参数的构造必须要有相应的配置文件设置。
ServiceHost(Object,Uri[]) Object参数为一个服务类的实例(如示例一中的FirstService类),Uri[]参数指定服务终结点的默认基地址,对应于我们配置文件中 的<host><baseAddress>配置节点下设置。此构造函数使用于”单实例”的服务。
ServiceHost(Type,Uri[]) Type参数指定服务的类型(使用typeof获取),对应于配置文件中<service>配置节点的name属性,如示例一中 的<service name="Xfrog.Study.WCF.FirstService"…>,Uri[]参数指定服务终结点的默认基地址。
ServiceHost.AddServiceEndPoint方法
顾名思义,此方法用于向宿主添加一个服务终结点,该方法有8个重载,但实际上可区分为两个版本:三参数版本和四参数版本,三参数版本中,三个参数依次传入 终结点的契约类型、绑定及地址,其中契约类型可以使用String类型传入服务契约的全局限定名(如示例一中 的"Xfrog.Study.WCF.IFirstService",也可以使用typeof操作符来传入契约的类型(Type);绑定参数传入一个 Binding对象,该对象可以通过预定义绑定类型来实例化;地址参数可以使用String类型传入也可以使用Uri类型实例传入,与使用配置文件相似, 地址可使用绝对地址或相对地址。由于第一、三参数分别有两个重载,所以三参数版本对应有6个重载版本。
四参数的版本,除了前述三个参数外,第四个参数为一个Uri类型,该地址表示一个服务的侦听地址,即服务通过该地址来侦听客户端的请求。所以四参数的版本实际上是提供了“多个终结点在同一个地址上侦听”的功能。
示例三
通过编程方式为示例一添加终结点:
1.复制实例一文件夹,将其改名为XfrogWCFStudy003
2.打开Host项目下的App.config文件,屏蔽掉配置内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--
<system.serviceModel>
<services>
<service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="Xfrog.Study.WCF.IFirstService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="falses"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
-->
</configuration>
3.修改Host项目Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using Xfrog.Study.WCF;
namespace Host
{class Program
{static void Main(string[] args)
{using (ServiceHost host = new ServiceHost(typeof(FirstService)))
{host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
host.Open();
Console.WriteLine("服务已启动,按任意键中止...");Console.ReadKey(true);
host.Close();
}
}
}
}
示例四
1.通过编程方式启用元数据
2.获取终结点信息
Program.cs代码如下,请参照MSDN了解类的使用方法
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using Xfrog.Study.WCF;
using System.ServiceModel.Description;
namespace Host
{class Program
{static void Main(string[] args)
{using (ServiceHost host = new ServiceHost(typeof(FirstService)))
{//启用元数据
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetUrl = new Uri("http://localhost:8000/mex");smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
host.Open();
//获取终结点信息
foreach (ServiceEndpoint point in host.Description.Endpoints)
{Console.WriteLine("终结点:");Console.WriteLine("\t地址: {0}", point.Address.ToString());Console.WriteLine("\t绑定: {0}", point.Binding.ToString());Console.WriteLine("\t契约: {0}", point.Contract.ToString());KeyedByTypeCollection<IEndpointBehavior> behaviors = point.Behaviors;
foreach (IEndpointBehavior behavior in behaviors)
{Console.WriteLine("Behavior: {0}", behavior.ToString());}
}
Console.WriteLine("服务已启动,按任意键中止...");Console.ReadKey(true);
host.Close();
}
}
}
}
WCF编程系列(六)以编程方式配置终结点的更多相关文章
- 学习ASP.NET Core Blazor编程系列六——新增图书(上)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- Java并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Blazor编程系列六——初始化数据
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- prometheus学习系列六: Prometheus relabel配置
relabel_config 重新标记是一个功能强大的工具,可以在目标的标签集被抓取之前重写它,每个采集配置可以配置多个重写标签设置,并按照配置的顺序来应用于每个目标的标签集. 目标重新标签之后,以_ ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验
运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...
- 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序
在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇
上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的.但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的. 之前我们尝试过使用代码生成 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用
RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
随机推荐
- Google的IP地址一览表,加上代理服务器
Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 93.123.23.6 93.123.23.7 93.123. ...
- .NET通用基本权限系统
DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一.开发技术:B/S(.NET C# ) 1.Windows XP以上 (支援 ...
- LDO稳压器工作原理
LDO稳压器工作原理 随着便携式设备(电池供电)在过去十年间的快速增长,像原来的业界标准 LM340 和LM317 这样的稳压器件已经无法满足新的需要.这些稳压器使用NPN 达林顿管,在本文中称其为N ...
- 《Effect Java》 归纳总结
目录: 一.创建和销毁对象 (1 ~ 7) 二.对于所有对象都通用的方法 (8 ~ 12) 三.类和接口 (13 ~ 22) 四.泛型 (23 ~ 29) 五.枚举和注解 (30 ~ 37) 六.方法 ...
- 在ubuntu上面配置nginx实现反向代理
1.下载nginx 官网:http://nginx.org/en/download.html 直接在服务器上下载 wget http://nginx.org/download/nginx- ...
- oracle查询前10条记录
select * from table_name where rownum<11;
- PHP根据数组的值分组
PHP根据数组的值分组,php array中没有自带这个函数但是很常用,今天写了出来记录一下. 代码: $_array = array( array(1,11,'2016-05-18') ...
- 2015北京网络赛 F Couple Trees 暴力倍增
Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...
- 戴尔笔记本win8.1+UEFI下安装Ubuntu14.04过程记录
瞎扯:笔记本刚买不久就想装ubuntu来着,但结果发现BIOS启动方式为UEFI,网上一搜索发现跟曾经的双系统安装方法不一样,看详细教程感觉相当复杂,并且也有点操心折腾跪了这新本本所以一直没有动手.但 ...
- android学习日记24--Android 菜单开发
菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...