摘要: 一、性能概述 WCF服务的性能取决于很多因素。出了CPU、RAM和网络性能等常见的因素外,实例上下文模式、并发模式、数据契约的设计或使用的绑定等与WCF有关的因素都起着重要的作用。 实例上下文模式用来控制服务对象的实例化行为有PerCall、PerSession和Singleton三种模式可供选择。 绑定决定了传输协议和编码格式。此外,通过绑定可以... 阅读全文
posted @ 2014-09-15 11:32 烧点饭 阅读(1278) 评论(0) 推荐(0) 编辑
摘要: 一、服务实例的生命周期概览 我们已经直到,通过显式调用Close方法或等待默认的超时时间到来,都可以释放服务实例。但是,在会话连接里,经常需要按一定顺序调用方法。 二、分步操作 会话契约的操作有时隐含了操作调用的顺序。WCF提供了一种被称之为分步操作(Demarcating Operation)的方法,以应对服务契约的操作需要指定执行顺序的情况。分步操作是使用O... 阅读全文
posted @ 2014-09-12 11:22 烧点饭 阅读(550) 评论(0) 推荐(0) 编辑
摘要: 一、实例上下文模式概述 实例上下文(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式。 在实例化服务器对象时,WCF采用了3种不同的模式:单调(Per-Call)模式,会话(Per-Session)模式和单例(Single)模式.其中会话模式是默认的。 ... 阅读全文
posted @ 2014-09-10 16:57 烧点饭 阅读(998) 评论(0) 推荐(0) 编辑
摘要: 一、绑定行为概述 为了支持服务端的其它本地特性,WCF定义了行为的概念。行为就是服务的本地特性,不会影响服务的通信模式。客户端并不知道服务端行为,所以行为不会出现在服务的绑定和发布的元数据中。说下WCF下“契约(Contract)”和“行为(Behavior)”的区别:契约是涉及双边的描述(契约是服... 阅读全文
posted @ 2014-09-02 17:15 烧点饭 阅读(515) 评论(0) 推荐(0) 编辑
摘要: 一、绑定概述 WCF提供了一个编程框架,可以抽象化服务创建的复杂过程。绑定允许开发人员将精力集中在问题本身上,而无需考虑如何创建允许系统运行的架构,因为WCF已经创建了架构。 绑定类型是开发人员控制WCF程序与其它消息交互的主要手段。从功能上看,绑定创建了通道工厂或通道侦听器的堆栈对象。在服务模型层和通道层中,绑定在服务模型层是可见的,但它创建的对象作用于通道层。 WCF通道模型: 绑... 阅读全文
posted @ 2014-09-01 14:24 烧点饭 阅读(499) 评论(0) 推荐(0) 编辑
摘要: 一、契约的基本概念 契约是消息参与者之间的约定。在SOA架构中,契约提供了服务通信所必需的元数据。契约用来定义数据类型,操作,消息交换模式和消息交换使用的传输协议。契约通常是在标准化平台中使用与编程语言无关的XML格式发布的。这样做的好处是:允许契约涉及的各方都能够使用和理解契约。在WCF中,服务元... 阅读全文
posted @ 2014-08-28 14:59 烧点饭 阅读(672) 评论(0) 推荐(0) 编辑
摘要: 一、服务服务是一组公开功能的集合。服务内部包含了如语言、技术、版本与框架等概念,服务之间的交互只允许使用规定的通信模式外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述可用的功能及服务可能采用的通信方式WCF不允许客户端直接与服务交互,客户端总是使用代理将调用转发给服务 ,... 阅读全文
posted @ 2014-08-25 15:54 烧点饭 阅读(910) 评论(0) 推荐(0) 编辑
摘要: 一、SOA简介1. SOA(面向服务架构)既是一种编程方式,也是软件开发的一种架构方法。根据这种架构方法,应用程序是由具有一定行为(称为服务)的功能单元组成的。2. SOA的基本思想是构建一个粗粒度、松散耦合的系统,在这个系统中,服务的使用者与服务的实现唯一共同拥有的东西,就是公开的服务操作和参数的... 阅读全文
posted @ 2014-08-23 10:39 烧点饭 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 一、IIS部分环境:Windows Server 2008 R21.安装WAS,如下图所示:2.网站net.tcp协议绑定,如下图所示:3.网站启用net.tcp,如下图所示:二、WCF代码部分1.DesignCaseService.svc2.web.config配置示例: ... 阅读全文
posted @ 2014-08-21 16:47 烧点饭 阅读(7001) 评论(4) 推荐(2) 编辑
摘要: 一、WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,是Windows... 阅读全文
posted @ 2014-08-19 15:49 烧点饭 阅读(2166) 评论(3) 推荐(1) 编辑
摘要: 目录理解垃圾回收平台的基本工作原理垃圾回收算法垃圾回收与调试使用终结操作来释放本地资源对托管资源使用终结操作是什么导致Finalize方法被调用终结操作揭秘Dispose模式:强制对象清理资源使用实现了Dispose模式的类型C#的using语句手动监视和控制对象的生存期对象复活代线程劫持大对象一、... 阅读全文
posted @ 2014-06-11 16:40 烧点饭 阅读(1067) 评论(1) 推荐(1) 编辑
摘要: 一、CLR线程池基础 前面说过,创建和销毁线程是一个比较昂贵的操作,太多的线程也会浪费内存资源。由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还有损于性能。为了改善这个情况,CLR使用了代码来管理它自己的线程池。可将线程池想像成可由你的应用程序使用的一个线程集合。每个进程都有一个线程池,它在各个应用程序域(AppDomain)是共享的. CLR初始化时,线程池是没有线程的。在内部,线程池维护了一个操作请求队列。应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的队列中。线程池的代码从这个队列中提取记录项,将这个记录项派遣(dispat... 阅读全文
posted @ 2014-03-27 19:49 烧点饭 阅读(2212) 评论(0) 推荐(2) 编辑
摘要: 一、Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例。进程不过是应用程序的一个实例要使用的资源的一个集合。每个进程都赋予了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进行访问。这样就确保了应用程序集的健壮性,因为一个进程无法破坏另一个进程里的数据和代码。另外,进程是无法访问到OS的内核代码和数据。 如果一个应用程序进入死循环时,如果只是单核的CPU的,它会无限循环执行下去,不能执行其他代码,这样会使系统停止响应。对此,Microsoft拿出的一个解决方案——线程。线程的职责就是对CPU的虚拟化。Wi.. 阅读全文
posted @ 2014-03-17 15:26 烧点饭 阅读(942) 评论(0) 推荐(0) 编辑
摘要: 我们知道,一个值类型的变量永远不可能为null。它总是包含值类型本身。遗憾的是,这在某些情况下会成为问题。例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型。但是,数据库中的一个列可能允许值为空;用Microsoft .NET Framework处理数据库可能变得相当困难,因为在CLR中,没有办法将一个Int32值表示为null。 Microsoft ADO.NET的表适配器确实支持可空类型。但遗憾的是,System.Data.SqlType命名空间中的值类型没有用可空类型替换,部分原因是类型之间没有"一对一"的对应关系。例如,S 阅读全文
posted @ 2014-03-06 13:53 烧点饭 阅读(782) 评论(0) 推荐(1) 编辑
摘要: attribute可以说是Microsoft .NET Framework提出的最具创意的技术之一了。利用attribute,可以声明性的为自己的代码构造添加注解,从而实现一些特殊的功能。attribute允许将定义的信息应用于几乎每一个元数据表的记录项。这种可扩展的元数据信息能在运行时查询,从而动态改变代码的执行方式。 一、使用attribute attribute可运用于类型和成员。Microsoft采取了一种机制提供对用户自定义的attribute的支持。这种机制叫做定制attribute。 关于自定义attribute,首先应该知道:它们只是将一些附加信息与某个目标元素关联起... 阅读全文
posted @ 2014-03-05 15:35 烧点饭 阅读(1801) 评论(0) 推荐(1) 编辑
摘要: 回调函数是一种非常有用的编程机制,它已经存在很多年了。Microsoft .NET Framework通过委托(delegate)来提供一种回调机制。不同于其他平台(比如非托管C++)的回调机制,委托提供了多得多的功能。例如,委托确保回调方法是类型安全的(这是CLR最重要的目标之一)。委托还允许顺序调用多个方法,并支持调用静态方法和实例方法。一、初识委托为了理解委托,先看看如何使用它。委托4个最基本的步骤:1)定义委托类型2)有一个方法包含要执行的代码3)创建一个委托实例化(包含声明委托对象)4)执行调用(invoke)委托实例具体解释如下:1.定义委托类型委托类型就是参数类型的一个列表以.. 阅读全文
posted @ 2014-03-01 13:10 烧点饭 阅读(1431) 评论(1) 推荐(2) 编辑
摘要: 数组是允许将多个数据项当作一个集合来处理的机制。CLR支持一维数组、多维数组和交错数据(即由数组构成的数组)。所有数组类型都隐式地从System.Array抽象类派生,后者又派生自System.Object。这意味着数组始终是引用类型,是在托管堆上分配的。在你应用程序的变量或字段中,包含的是对数组的引用,而不是包含数组本身的元素。下面的代码更清楚的说明了这一点:Int32[] myIntegers; //声明一个数组引用myIntegers = new int32[100] //创建含有100个Int32的数组 在第一行代码中,myIntegers变量能指向一个一维数组(由Int32值构... 阅读全文
posted @ 2014-02-26 16:05 烧点饭 阅读(1680) 评论(0) 推荐(3) 编辑
摘要: 一、枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对。 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色:internal enum Color {While, //赋值0Red, //赋值1Green, //赋值2Blue, //赋值3Orange //赋值4} 使用枚举类型的好处: 1)枚举类型使程序更容易编写、阅读和维护。有了枚举类型,符号名称可在代码中随便使用,开发人员不需要记住每个硬编码的含义。而且,一旦与符号名称对应的值发生变化,代码也可以简单的... 阅读全文
posted @ 2014-02-25 14:14 烧点饭 阅读(2462) 评论(0) 推荐(0) 编辑
摘要: 一、字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发。 每个字符都表示成System.Char结构(一个值类型) 的一个实例。System.Char类型提供了两个公共只读常量字段:MinValue(定义成"\0")和MaxValue(定义成'\uffff')。 针对Char的一个实例,可以调用GetUnicodeCategory方法,这个方法返回的是System.Globalization.UnicodeCategory枚举类型的一个值。这个值支出该字符是控制字符、货币符号、小写符号、大写符号、标 阅读全文
posted @ 2014-02-24 12:40 烧点饭 阅读(1733) 评论(1) 推荐(2) 编辑
摘要: 一、类和接口继承 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和GetType。该类是其他所有类的根或者说最终基类。换言之,所有类都继承了Object的4个实例方法。这还意味着能操作Object类的实例的代码实际能操作任何类的实例。 在CLR中,任何类都肯定从一个类也只能从一个类(而且只能从Objetc派生的类)派生的。这个类称为基类。基类提供了一组方法签名和这些方法的实现。你定义的新类可在将来由其它开发人员用作基类——所有方法签名和方法实现都会由新的派生类继.. 阅读全文
posted @ 2014-02-20 15:40 烧点饭 阅读(1104) 评论(0) 推荐(0) 编辑
摘要: 泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用"。 简单地说,开发人员先定义好一个算法,比如排序、搜索、交换等。但是定义算法的开发人员并不设定该算法要操作什么数据类型;该算法可广泛地应用于不同类型的对象。然后,另一个开发人员只要指定了算法要操作的具体数据类型,就可以使用这个现成的算法了。 泛型有两种表现形式:泛型类型和泛型方法。 泛型类型:大多数算法都封装在一个类型中,CLR允许创建泛型引用类型和泛型值类型,但不允许创建泛型枚举类型。除此之外,CLR还允许创建泛型接口和泛型委托。 泛型方法:方法偶尔也封装有用的算法,所以C 阅读全文
posted @ 2014-02-18 16:57 烧点饭 阅读(1761) 评论(0) 推荐(0) 编辑
摘要: 一、 设计要公开事件的类型 如果类型定义了事件成员,那么类型(或类型实例)就可以通知其他对象发生了一些特定的事情。 例如,Button类提供了一个名为Click的事件。应用程序中的一个或多个对象可能想接受这个事件的通知,以便在Button被单击之后采取某些操作。事件就是实现这种交互的类型成员。 ... 阅读全文
posted @ 2014-02-17 15:39 烧点饭 阅读(956) 评论(0) 推荐(1) 编辑
摘要: 一、无参属性 对于字段,强烈建议将所有的字段都设为private。如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法。封装了字段访问的方法通常称为访问器(accessor)方法。访问器方法可选择对数据的合理性进行检查,确保对象的状态永远不被破坏。如下代码: private sealed class Employee { private String m_Name; private Int32 m_Age; public String GetName(){ return m_Name; }... 阅读全文
posted @ 2014-02-12 14:37 烧点饭 阅读(919) 评论(0) 推荐(0) 编辑
摘要: 一、可选参数和命名参数 在设计一个方法的参数时,可为部分或全部参数分配默认值。然后,调用这些方法的代码时可以选择不指定部分实参,接受默认值。此外,调用方法时,还可以通过指定参数名称的方式为其传递实参。比如:internal static class Program { private static Int32 s_n = 0; private static void M(Int32 x=9, String s = "A",DateTime dt = default(DateTime), Guid guid = new Guid()) { Console.WriteLi... 阅读全文
posted @ 2014-02-11 13:39 烧点饭 阅读(712) 评论(0) 推荐(0) 编辑
摘要: 一、实例构造器和类(引用类型) 类实例构造器是允许将类型的实例初始化为良好状态的一种特殊的方法。 类实例构造器方法在"方法定义元数据表"中始终叫.ctor(代表constructor)。创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实例构造器来设置对象的初始化状态。 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零。构造器将没有显式重写的所有字段保证都有一个0或null值。 与其他方法不同,实例构造器永远不能被继承。也就是说,类只有类自己定义的实例构造器。 如果你定义 阅读全文
posted @ 2014-02-10 11:59 烧点饭 阅读(970) 评论(2) 推荐(0) 编辑
摘要: 7.1常量 常量(constant)是一个特殊的值,它是一个从不变化的值。 在定义常量时,它的值必须在编译时确定。确定之后,编译器将常量的值保存到程序集的元数据中。这就意味着只能为编译器认定的基元类型定义常量。 C#是允许定义一个非基元类型的常量变量(constant variable),但这个值应设为null。public sealed class SomeType { //SomeType不是基元类型,但C#允许定义 //值为null的这种类型的一个常量变量 public const SomeType Empty = null; } 由于常量的值从不变化,所... 阅读全文
posted @ 2014-01-27 13:11 烧点饭 阅读(569) 评论(0) 推荐(0) 编辑
摘要: 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量 常量就是指出数据值恒定不变的符号。这些符号通常用于使代码更容易阅读和维护。常量通常与类型关联,而不与类型的实例关联。从逻辑上讲,常量始终是静态成员。 2)字段字段表示一个只读或可读/写的数据值。字段可以是静态的,这时是类型状态的一部分;字段也可以是实例(非静态)的,这时字段是对象状态的一部分。强烈建议将字段声明成为私有字段,防止类型或对象状态被外部代码破坏。 3)实例构造器 实例构造器是将新对象的实例字段初始化为良好初始化状态(即完成预期初始化)的一种特殊方法。 4)类型构造器 类型构造器是将类型的静... 阅读全文
posted @ 2014-01-25 15:55 烧点饭 阅读(620) 评论(0) 推荐(0) 编辑
摘要: FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处。为此,System.Object提供了虚方法GetHashCode,它能获取任意对象的Int32哈希值。 如果你重写了Equals方法,那么还应重写GetHashCode方法。因为在System.Collection.Hashtable类型、System.Collections.Generic.Dictionary类型以及其他一些集合实现中,要求两个对象为了相等,必须具有相同的哈希码,所以重写了Equals,那么还应该重写GetHashCode,确保相等性算法和对象哈希码算法是一致的。 System.V... 阅读全文
posted @ 2014-01-25 11:31 烧点饭 阅读(608) 评论(0) 推荐(0) 编辑
摘要: 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制。 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存。分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量。 2)值类型的字段复制到新的分配的堆内存。 3)返回对象的地址。现在,这个地址是对一个对象的引用,值类型现在是一个引用类型。 拆箱不是直接将装箱过程倒过来。拆箱的代价比装箱低得多。拆箱其实就是一个获取一个指针的过程,该指针指向包含在一个对象中的原始值类型(数据字段)。事实上,指针指向的是已装箱实例中的未... 阅读全文
posted @ 2014-01-24 14:10 烧点饭 阅读(611) 评论(0) 推荐(0) 编辑
摘要: CLR支持两种类型:引用类型和值类型。 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型。引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址。 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配。 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化。 3)对象中的其他字节(为字段而设)总是设为零。 4)从托管堆上分配一个对象时,可能强制执行一次垃圾回收操作。 如果所有类型都是引用类型,应用程序的性能 阅读全文
posted @ 2014-01-23 15:37 烧点饭 阅读(538) 评论(2) 推荐(0) 编辑