一个服务作为一系列终结点被定义的。每个终结点都有一个地址,绑定和契约。契约就是暴露终结点能力的。地址就是这些应用或服务从网络的哪个地址可找到,契约是关于如何访问他们的。
在终结点和契约间有一对多的关系。一个终结点可以只有一个契约,但是一个契约可以被很多终结点引用。尽管一个终结点可以仅仅确认一个契约,接口 聚合使能一个单独的契约来暴露多个接口。另外,多个有同样绑定但是不同契约的终结点可以位于同一个地址,给一个单独终结点实现所有契约的假象。
通过在一个服务中的多个终结点暴露一个契约,你可以让服务在不同绑定下都可以访问。你可以定义一个终结点使用WS-I基础协议绑定来得到最大访 问量同时使用另外一个使用TCP协议和二进制编码的终结点来实现更快的性能。通过把多个接口变成一个接口的假象,你可以通过合并在一个单一的服务访问,初 步编纂成独立的接口能力。
列表2.10 在一个终结点中暴露多个契约
using System;
using System.ServiceModel;
using System.Threading; namespace EssentialWCF
{
[ServiceContract]
public interface IGoodStockService
{
[OperationContract]
double GetStockPrice(string ticker);
}
[ServiceContract]
public interface IGreatStockService
{
[OperationContract]
double GetStockPriceFast(string ticker);
}
[ServiceContract]
public interface IALLStockServices : IGoodStockService, IGreatStockService{};
public class AllStockServices : IALLStockServices
{
public double GetStockPrice(string ticker)
{
Thread.Sleep(5000);
return 94.85;
}
public double GetStockPriceFast(string ticker)
{
return 94.85;
}
}
}
列表2.11一个为三个契约暴露多个终结点的配置文件。有一个为IGoodStockService契约的终结点,两个为IGreateStockService契约的终结点和一个为IAllStockServices契约的终结点。
因为有多个终结点共享一个寻址方案,每个终结点必须定义不同的地址。使用了相对地址,所以每个终结点的完全地址是服务基地址加上相对地址。
列表2.11 在一个服务中暴露多一个终结点
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name ="EssentialWCF.StockServices" behaviorConfiguration="mexServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/EssentialWCF"/>
</baseAddresses>
</host>
<endpoint name="GoodStockService"
binding="basicHttpBinding"
contract="EssentialWCF.IGoodStockService"/>
<endpoint name="BetterStockService"
address="better"
binding="basicHttpBinding"
contract="EssentialWCF.IGreatStockService"/>
<endpoint name="BestStockService"
address="best"
binding="wsHttpBinding"
contract="EssentialWCF.IGreatStockService"/>
<endpoint name="AllStockServices"
address="all"
binding ="wsHttpBinding"
contract="EssentialWCF.IAllStockServices"/>
<endpoint name ="mex"
binding ="mexHttpBinding"
contract="IMetadataExchange"
</service>
</services>
</system.serviceModel>
</configuration>
因为IGreatStockService契约在多个终结点上暴露,客户端应用程序必须在为契约创建一个代理实例时引用终结点名称。如果终结点 名称没有确认,WCF将会抛出一个错误因为它无法知道使用哪个终结点。列表2.12显示了对GreatStockServiceClient代理的两次使 用:一次使用basicHttpBinding访问BetterStockService,另一次使用wsHttpBinding访问 BestStockService.
列表2.12 当多个终结点被定义使用名字确认每个终结点
using (localhost.GreatStockServiceClient proxy =
new Client.localhost.GreatStockServiceClient("BetterStockService"))
{
Console.WriteLine(proxy.GetStockPriceFast("MSFT"));
}
using (localhost.GreatStockServiceClient proxy =
new Client.localhost.GreatStockServiceClient("BestStockService"))
{
Console.WriteLine(proxy.GetStockPriceFast("MSFT"));
}

在一个服务中实现 多个契约 和终结点 z的更多相关文章

  1. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  2. 微服务中的 API 网关(API Gateway)

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需进行 ...

  3. 服务中的 API 网关(API Gateway)

    我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api ...

  4. 微服务中的CAP定律

    说到微服务,先给大家提一下CAP分布式应用知识吧,无论你微服务使用的是阿里云开源的Dubbo还是基于Springboot的一整套实现微服务的Springcloud都必须遵循CAP定理不然你所实现的分布 ...

  5. 在一个shell中查看管理 任务(前台和后台)/工作jobs 的命令

    在一个shell中查看管理 任务(前台和后台)/工作jobs 的命令 jobs是在同一个shell环境而言, 才有意义的. 为什么有jobs这个命令? 是因为, 如果从cmd line运行gui程序时 ...

  6. 没想到 Hash 冲突还能这么玩,你的服务中招了吗?

    背景 其实这个问题我之前也看到过,刚好在前几天,洪教授在某个群里分享的一个<一些有意思的攻击手段.pdf>,我觉得这个话题还是有不少人不清楚的,今天我就准备来“实战”一把,还请各位看官轻拍 ...

  7. 微服务中的CAP原则

    CAP原则:指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三个要素最多同时实现两点不可能同时实 ...

  8. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  9. Entity Framework 6 Recipes 2nd Edition(9-7)译->在WCF服务中序列化代理

    9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...

随机推荐

  1. C# 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。这个错误是什么原因引起的?

    C# 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.这个错误是什么原因引起的? 2011-12-17 22:45 提问者: 匿名|浏览次数:6056次 我来帮他解答 图片 符号 ...

  2. 文本编辑器 未完成 Treap

    #include<bits/stdc++.h> using namespace std; const int maxn = 2e6+1e5; unsigned int SEED = 17; ...

  3. Python爬虫常用之HtmlParser

    HtmlParser,顾名思义,是解析Html的一个工具.python自带的. 一.常用属性和方法介绍 HtmlParser是一个类,在使用时一般继承它然后重载它的方法,来达到解析出需要的数据的目的. ...

  4. maven-javadoc-plugin

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javad ...

  5. laravel的一些语法

    5.1的一些语法 检索表中的所有行 $users = DB::table('users')->get();因为查询出来的是对象,所以可以直接选择DB::table('users')->ge ...

  6. 转 Oracle]如何在Oracle中设置Event

    https://www.cnblogs.com/gaojian/p/7619960.html 为了调查Oracle 的故障,可以通过设置event ,来了解详细的状况.方法如下: ■ 如果使用 SPF ...

  7. linux系统优化基础

    linux系统优化基础 tags: linux 优化 kingle---### 1, 查看centos版本:cat etc/redhat-release 看看centos架构信息:uname -m 查 ...

  8. setContentView和inflate区别

    一般用LayoutInflater做一件事:inflate inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化为View对象.其中有一个比较常用,View infl ...

  9. 10 个最佳的 Node.js 的 MVC 框架

    补充:http://nokit.org/ https://thinkjs.org/zh-cn/doc/index.html Node.js 是一个基于Chrome JavaScript 运行时建立的一 ...

  10. css3轮播渐显效果 2016/11/29

    css3因为其兼容性的问题,被我忽略很久,这次正好做到一个轮播渐显的效果,想了想,正好复习下css3的相关内容,废话不多说,直接上代码. <ul class="cb-slideshow ...