Bingding模型
public abstract class Binding : IDefaultCommunicationTimeouts
public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters) where TChannel : class, IChannel
{
this.EnsureInvariants();
BindingContext bindingContext = new BindingContext(new CustomBinding(this), parameters, listenUriBaseAddress, listenUriRelativeAddress, listenUriMode);
IChannelListener<TChannel> channelListener = bindingContext.BuildInnerChannelListener<TChannel>();
bindingContext.ValidateBindingElementsConsumed();
this.ValidateSecurityCapabilities(channelListener.GetProperty<ISecurityCapabilities>(), parameters);
return channelListener;
}
通过当前绑定创建CustomBinding, BindingContext bindingContext = new BindingContext()创建绑定上下文,bindingContext.BuildInnerChannelListener<TChannel>();创建信道监听器管道,返回最上层的信道监听器
public class BindingContext
{
private CustomBinding binding;
private BindingParameterCollection bindingParameters;
private Uri listenUriBaseAddress;
private ListenUriMode listenUriMode;
private string listenUriRelativeAddress;
private BindingElementCollection remainingBindingElements;
[__DynamicallyInvokable]
public CustomBinding Binding
{
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.binding;
}
}
[__DynamicallyInvokable]
public BindingParameterCollection BindingParameters
{
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.bindingParameters;
}
}
public Uri ListenUriBaseAddress
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.listenUriBaseAddress;
}
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
set
{
this.listenUriBaseAddress = value;
}
}
public ListenUriMode ListenUriMode
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.listenUriMode;
}
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
set
{
this.listenUriMode = value;
}
}
public string ListenUriRelativeAddress
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.listenUriRelativeAddress;
}
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
set
{
this.listenUriRelativeAddress = value;
}
}
[__DynamicallyInvokable]
public BindingElementCollection RemainingBindingElements
{
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.remainingBindingElements;
}
}
[__DynamicallyInvokable]
public BindingContext(CustomBinding binding, BindingParameterCollection parameters) : this(binding, parameters, null, string.Empty, ListenUriMode.Explicit)
{
}
public BindingContext(CustomBinding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode)
{
if (binding == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
}
if (listenUriRelativeAddress == null)
{
listenUriRelativeAddress = string.Empty;
}
if (!ListenUriModeHelper.IsDefined(listenUriMode))
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("listenUriMode"));
}
this.Initialize(binding, binding.Elements, parameters, listenUriBaseAddress, listenUriRelativeAddress, listenUriMode);
}
[__DynamicallyInvokable]
public IChannelFactory<TChannel> BuildInnerChannelFactory<TChannel>()
{
return this.RemoveNextElement().BuildChannelFactory<TChannel>(this);
}
public IChannelListener<TChannel> BuildInnerChannelListener<TChannel>() where TChannel : class, IChannel
{
return this.RemoveNextElement().BuildChannelListener<TChannel>(this);
}
[__DynamicallyInvokable]
public bool CanBuildInnerChannelFactory<TChannel>()
{
BindingContext bindingContext = this.Clone();
return bindingContext.RemoveNextElement().CanBuildChannelFactory<TChannel>(bindingContext);
}
public bool CanBuildInnerChannelListener<TChannel>() where TChannel : class, IChannel
{
BindingContext bindingContext = this.Clone();
return bindingContext.RemoveNextElement().CanBuildChannelListener<TChannel>(bindingContext);
}
[__DynamicallyInvokable]
public T GetInnerProperty<T>() where T : class
{
if (this.remainingBindingElements.Count == )
{
return default(T);
}
BindingContext bindingContext = this.Clone();
return bindingContext.RemoveNextElement().GetProperty<T>(bindingContext);
}
[__DynamicallyInvokable]
public BindingContext Clone()
{
return new BindingContext(this.binding, this.remainingBindingElements, this.bindingParameters, this.listenUriBaseAddress, this.listenUriRelativeAddress, this.listenUriMode);
}
private BindingElement RemoveNextElement()
{
BindingElement bindingElement = this.remainingBindingElements.Remove<BindingElement>();
if (bindingElement != null)
{
return bindingElement;
}
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("NoChannelBuilderAvailable", new object[]
{
this.binding.Name,
this.binding.Namespace
})));
}
internal void ValidateBindingElementsConsumed()
{
if (this.RemainingBindingElements.Count != )
{
StringBuilder stringBuilder = new StringBuilder();
foreach (BindingElement current in this.RemainingBindingElements)
{
if (stringBuilder.Length > )
{
stringBuilder.Append(CultureInfo.CurrentCulture.TextInfo.ListSeparator);
stringBuilder.Append(" ");
}
string text = current.GetType().ToString();
stringBuilder.Append(text.Substring(text.LastIndexOf('.') + ));
}
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("NotAllBindingElementsBuilt", new object[]
{
stringBuilder.ToString()
})));
}
}
private BindingContext(CustomBinding binding, BindingElementCollection remainingBindingElements, BindingParameterCollection parameters, Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode)
{
this.Initialize(binding, remainingBindingElements, parameters, listenUriBaseAddress, listenUriRelativeAddress, listenUriMode);
}
private void Initialize(CustomBinding binding, BindingElementCollection remainingBindingElements, BindingParameterCollection parameters, Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode)
{
this.binding = binding;
this.remainingBindingElements = new BindingElementCollection(remainingBindingElements);
this.bindingParameters = new BindingParameterCollection(parameters);
this.listenUriBaseAddress = listenUriBaseAddress;
this.listenUriRelativeAddress = listenUriRelativeAddress;
this.listenUriMode = listenUriMode;
}
}
Bingding模型的更多相关文章
- 1. AMQP 0-9-1模型简介(官网直译)
关于这篇指导文档 本文提供了AMQP 0-9-1协议的一个概述,它是RabbitMQ所支持的协议之一. AMQP 0-9-1是什么 AMQP 0-9-1(Advanced Message Queuin ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET路由模型解析
大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
- webapi - 模型验证
本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
随机推荐
- js事件传播的一个疑惑
在学习事件传播的时候,发现一个问题,当时是这样子的. 我给多层元素分别绑定了冒泡和捕获事件.按道理应该先从外向内执行完所有的捕获事件,再由内向外执行所有的冒泡事件. 但是天不随人愿啊,有个元素偏偏先执 ...
- 在js里UTF-8与GB2312的互转
js的函数如下: function GB2312UTF8() { this.Dig2Dec = function(s) { var retV = 0; if (s.length == 4) { for ...
- blog.codedream.ren
博客将转到 CodeDream ,新的链接是 http://blog.codedream.ren
- 谈谈javaScript
谈谈javaScript (杰我学习) 一. 什么是JavaScript 人们通常所说的JavaScript,其正式名称为ECMAScript.这个标准由ECMA组织发展和维护.ECMA ...
- hdu-5666 Segment(俄罗斯乘法or大数乘法取模)
题目链接: Segment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
- Can't locate Log/Dispatch.pm in @INC
记录一下配置mha的时候遇到的错误,使用perl模块发送邮件的时候报以下错误: # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate ...
- CentOS7.0安装Ceph(jewel)及以上版本
背景 由于docker的Ceph插件rexray对Ceph版本有一定的要求,当Ceph版本为hammer (0.94.10)时,rexray无法成功创建rbd设备.CentOS 7及以上版本,默认安装 ...
- hibernate 学习 一 基本概念
1: Hibernate对JDBC进行封装,以面向对象的方式对关系型数据库进行操作. 2: Hibernate的配置文件: hibernate.properties 或者 hibernate.c ...
- 02-安装JDK - Java快速入门
jdk安装的版本
- 梦工厂实验室 蛇形填数 dfs
问题 D: 蛇形填数 时间限制: 3 Sec 内存限制: 64 MB提交: 28 解决: 5[提交][状态][讨论版] 题目描述 在n*n方阵里填入1,2,...,n*n,要求填成蛇形.例如n=4 ...