WCF编程系列(六)以编程方式配置终结点

时间:2021-11-03 02:39:15

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文件,屏蔽掉配置内容:

隐藏行号 复制代码 ? App.config
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <!--
  4.   <system.serviceModel>
  5.     <services>
  6.       <service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
  7.         <host>
  8.           <baseAddresses>
  9.             <add baseAddress="http://localhost:8000/"/>
  10.           </baseAddresses>
  11.         </host>
  12.         <endpoint address="" binding="basicHttpBinding" contract="Xfrog.Study.WCF.IFirstService"></endpoint>
  13.         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
  14.       </service>
  15.     </services>
  16.     <behaviors>
  17.       <serviceBehaviors>
  18.         <behavior name="behaviorConfiguration">
  19.           <serviceMetadata httpGetEnabled="falses"/>
  20.         </behavior>
  21.       </serviceBehaviors>
  22.     </behaviors>
  23.   </system.serviceModel>
  24.   -->
  25. </configuration>

3.修改Host项目Program.cs代码如下:

隐藏行号 复制代码 ? Program.cs
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Text;
    
  4. using System.ServiceModel;
    
  5. using Xfrog.Study.WCF;
    
  6. namespace Host
    
  7. {
    
  8.     class Program
    
  9.     {
    
  10.         static void Main(string[] args)
    
  11.         {
    
  12.             using (ServiceHost host = new ServiceHost(typeof(FirstService)))
    
  13.             {
    
  14.                 host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");
    
  15.                 host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));
    
  16.                 host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
    
  17.                 host.Open();
    
  18.                 Console.WriteLine("服务已启动,按任意键中止...");
    
  19.                 Console.ReadKey(true);
    
  20.                 host.Close();
    
  21.             }
    
  22.         }
    
  23.     }
    
  24. }
    

示例四

1.通过编程方式启用元数据

2.获取终结点信息

Program.cs代码如下,请参照MSDN了解类的使用方法

隐藏行号 复制代码 ? Program.cs
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Text;
    
  4. using System.ServiceModel;
    
  5. using Xfrog.Study.WCF;
    
  6. using System.ServiceModel.Description;
    
  7. namespace Host
    
  8. {
    
  9.     class Program
    
  10.     {
    
  11.         static void Main(string[] args)
    
  12.         {
    
  13.             using (ServiceHost host = new ServiceHost(typeof(FirstService)))
    
  14.             {
    
  15.                 //启用元数据
    
  16.                 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    
  17.                 smb.HttpGetUrl = new Uri("http://localhost:8000/mex");
    
  18.                 smb.HttpGetEnabled = true;
    
  19.                 host.Description.Behaviors.Add(smb);
    
  20.                 host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");
    
  21.                 host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));
    
  22.                 host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
    
  23.                 host.Open();
    
  24.                 //获取终结点信息
    
  25.                 foreach (ServiceEndpoint point in host.Description.Endpoints)
    
  26.                 {
    
  27.                     Console.WriteLine("终结点:");
    
  28.                     Console.WriteLine("\t地址: {0}", point.Address.ToString());
    
  29.                     Console.WriteLine("\t绑定: {0}", point.Binding.ToString());
    
  30.                     Console.WriteLine("\t契约: {0}", point.Contract.ToString());
    
  31.                     KeyedByTypeCollection<IEndpointBehavior> behaviors = point.Behaviors;
    
  32.                     foreach (IEndpointBehavior behavior in behaviors)
    
  33.                     {
    
  34.                         Console.WriteLine("Behavior: {0}", behavior.ToString());
    
  35.                     }
    
  36.                 }
    
  37.                 Console.WriteLine("服务已启动,按任意键中止...");
    
  38.                 Console.ReadKey(true);
    
  39.                 host.Close();
    
  40.             }
    
  41.         }
    
  42.     }
    
  43. }
    

WCF编程系列(六)以编程方式配置终结点的更多相关文章

  1. Java并发编程系列-&lpar;1&rpar; 并发编程基础

    1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...

  2. 学习ASP&period;NET Core Razor 编程系列六——数据库初始化

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. prometheus学习系列六: Prometheus relabel配置

    relabel_config 重新标记是一个功能强大的工具,可以在目标的标签集被抓取之前重写它,每个采集配置可以配置多个重写标签设置,并按照配置的顺序来应用于每个目标的标签集. 目标重新标签之后,以_ ...

  4. 游戏编程系列&lbrack;1&rsqb;--游戏编程中RPC协议的使用&lbrack;3&rsqb;--体验

    运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...

  5. 游戏编程系列&lbrack;2&rsqb;--游戏编程中RPC与OpLog协议的结合--序

    在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...

  6. 游戏编程系列&lbrack;1&rsqb;--游戏编程中RPC协议的使用&lbrack;2&rsqb;--Aop PostSharp篇

    上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的.但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的. 之前我们尝试过使用代码生成 ...

  7. 游戏编程系列&lbrack;1&rsqb;--游戏编程中RPC协议的使用

    RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

  8. 学习ASP&period;NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. C&num;编译器优化那点事 c&num; 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? &period;NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP&period;NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

随机推荐

  1. &period;NET C&num; 将 mdb 中数据读为 list&lt&semi;string&lbrack;&rsqb;&gt&semi; 其中 path 为数据库地址 ,sql 为查询语句

    using System.Data; using System.Data.OleDb; public static List<string[]> select_list(string pa ...

  2. Problem list

    不定时更新,发现好题目但是没时间写的就添加,写完就删除. hdu5732 求树的重心 poj1741

  3. 三级设置页面管理测试demo

    #include "PhoneBookWindow.h"#include "xWindow/xWindow.h"#include "hardwareD ...

  4. C&num;基础知识系列八(const和readonly关键字)

    前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了 ...

  5. PHP中session的使用

    1.初始化(使用session前都要使用,一个页面用一个就可以了) session_start(); 2.保存 $_SESSION[$sessionName]=$value; (value可以是dou ...

  6. handoff了解

    iOS8推出一个新特性,叫做Handoff.Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行.这个在iOS8 ...

  7. 菲菲更名宝贝&lpar;批量更名软件&rpar; v8&period;0 绿色版

    软件名称: 菲菲更名宝贝(批量更名软件)软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 1.5MB图片预览: 软件简介:菲 ...

  8. C&plus;&plus;11新特性--decltype (转)

    返回值 decltype(表达式) [返回值的类型是表达式参数的类型] 这个可也用来决定表达式的类型,就像Bjarne暗示的一样,如果我们需要去初始化某种类型的变量,auto是最简单的选择,但是如果我 ...

  9. 20175320 2018-2019-2 《Java程序设计》第3周学习总结

    20175320 2018-2019-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习了教材的第四章的内容.在这章中介绍了面向对象编程的概念以及Java编程中的类与对象, ...

  10. ArcGIS教程:树状图

    摘要 构造可显示特征文件里连续合并类之间的属性距离的树示意图(树状图). 使用方法 · 输入特征文件必须採用预定的特征文件格式. 特征文件可使用 Iso 聚类或创建特征工具来创建.该文件必须至少包括两 ...