【转】《WCF服务编程 第一章 WCF基础》第一回

原文地址:http://www.cnblogs.com/PirateCaptain/articles/1960954.html

什么是WCF?WCF全名Windows Communication Foundation,中文叫Windows通信基础,MS的名字起的多么的朴实合适,是Windows平台下开发和部署服务的软件开发包。WCF为服务提供了运行时环境(多次看到运行时,这玩意究竟干了什么这么重要呢?),使得开发者能够以CLR类型的方式使用服务(CLR类型是什么呢?能干吗?这个问题得去.NET框架程序设计里去找答案)。WCF的大部分功能都在System.ServiceModel这个.NET命名空间里,至少需要.NET3.0的支持。操作系统至少XPsp2以上。

我粗浅的理解是这样的:

什么是服务?WINDOWS操作系统里有很多服务(Services),基本是本地计算机使用的,服务其实吧就跟生活中一样,是一个抽象的概念,是面向组件的上一层概念,好多国内公司做软件服务外包,说的再通俗点,就是我给你钱,你给我做我指定的事情,怎么做我不管,我只从你这边拿到我想要的东西。WCF里的服务可以是跨网跨域的,不跨就没啥意义了,否则怎么叫分布式呢?再往前追溯就是Dcom,再上去就是Cobra,往后就是Indigo,其实是早期MS对WCF的称呼代号。

服务是公开的一组功能的集合。客户端与服务通过消息的发送和接受进行交互,WCF中的所有消息均为SOAP消息(xml之类的东东,上Google好好了解下)。WCF的消息与传输协议无关,而WEB服务(WS)则与传输协议有关(限于HTTP)。WCF服务通常通过公开元数据的方式描述可用的功能以及服务可能采用的通信方式,元数据的发布可以预先定义,它与具体的技术无关(如WSDL),非WCF客户端也可以将元数据作为本地类型导入到本地环境中,然后以本地CLR类与接口的方式进行调用,怎么理解这句话,其实吧,说白了就是导入服务上的类型到本地类型,然后调用本地类型,因为你的VS2008不可能直接使用网络上的元数据,你的编程测试都是本地的(代理类相关的东西)。

WCF不允许客户端直接与服务交互,那么客户端只能总是使用Proxy代理将调用转发给服务(这就像公司里的技术和客户之间会有销售做协调工作一样,具有很多的好处),WCF的编程模型要求即使是本地调用,仍然使用远程编程模型的实例化方式,并使用代理。

地址 WCF的每一个服务都具有一个唯一的地址。地址包含服务位置和传输协议,或者是用于服务通信的传输样式。以下是一些实例,其实和网址类似:

http://localhost:8080  http://localost:81/Service  net.tcp://localhost:8082 net.msmq://localhost 等等.WCF1.0支持的传输样式有 HTTP,TCP,Peer network,IPC,MSMQ等。

TCP地址:采用net.tcp协议进行传输,通常包括端口号,默认808。2个TCP可以共享一个端口号(但是后面的服务要求不是同一个)。

HTTP地址:采用http协议,也可以用https进行安全传输,默认端口80,也可以共享端口号。

IPC地址:采用net.pipe进行传输,这就是说它将使用Windows的命名管道机制。在WCF中,使用命名管道的服务只能接受来自同一台机器的调用,因此使用时要指明本地机器名或者localhost为管道提供一个唯一的标识符,每台机器只能打开一个命名管道,因此2个命名管道地址也不能共享一个管道名。

MSMQ:协议时net.msmq,即微软消息队列,必须为msmq指定队列名。如果是私有队列,还需要指定队列类型,共有的队列类型可以省略

Peer network:对等网地址,协议net.p2p。(GOOGLE上好好了解,掌握)

下面开始介绍WCF的另外一些概念

契约:WCF的所有服务都会公开为契约,契约和平台无关,有4种,服务契约ServiceContract,数据契约DataContract,错误契约FaultContract,和消息契约MessageContract。

服务契约示例,

[ServiceContract (NameSpace="tempUrl")]  //默认http://tempurl.org

[ServiceContract (Name="tempName")]  //定义别名

托管方式有 IIS托管(要求.NET4.0),自托管(最简单的就是自己做个Winform).重点看看托管的高级特性。

宿主类型ServiceHost实现的接口ICommunicationObject定义了一些高级特性,好好看看。

using System;

namespace System.ServiceModel
{
    // 摘要:
    //     为系统中所有面向通信的对象(包括通道、通道管理器、工厂、侦听器以及调度程序和服务主机)定义基本状态机的协定。
    public interface ICommunicationObject
    {
        // 摘要:
        //     获取面向通信的对象的当前状态。
        //
        // 返回结果:
        //     对象的 System.ServiceModel.CommunicationState 的值。
        CommunicationState State { get; }

        // 摘要:
        //     当通信对象完成从正在关闭状态转换到已关闭状态时发生。
        event EventHandler Closed;
        //
        // 摘要:
        //     当通信对象首次进入正在关闭状态时发生。
        event EventHandler Closing;
        //
        // 摘要:
        //     当通信对象首次进入出错状态时发生。
        event EventHandler Faulted;
        //
        // 摘要:
        //     当通信对象完成从正在打开状态转换到已打开状态时发生。
        event EventHandler Opened;
        //
        // 摘要:
        //     当通信对象首次进入正在打开状态时发生。
        event EventHandler Opening;

        // 摘要:
        //     使通信对象立即从其当前状态转换到关闭状态。
        void Abort();
        //
        // 摘要:
        //     开始一个异步操作以关闭通信对象。
        //
        // 参数:
        //   callback:
        //     接收异步关闭操作完成通知的 System.AsyncCallback 委托。
        //
        //   state:
        //     一个由应用程序指定的对象,它包含与异步关闭操作相关联的状态信息。
        //
        // 返回结果:
        //     引用异步关闭操作的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationObjectFaultedException:
        //     对处于 System.ServiceModel.CommunicationState.Faulted 状态的对象调用了 System.ServiceModel.ICommunicationObject.BeginClose()。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject 能够正常关闭之前所经过的默认超时。
        IAsyncResult BeginClose(AsyncCallback callback, object state);
        //
        // 摘要:
        //     开始一个异步操作以在指定超时内关闭通信对象。
        //
        // 参数:
        //   timeout:
        //     System.Timespan,指定在超时前必须完成发送操作的时间。
        //
        //   callback:
        //     接收异步关闭操作完成通知的 System.AsyncCallback 委托。
        //
        //   state:
        //     一个由应用程序指定的对象,它包含与异步关闭操作相关联的状态信息。
        //
        // 返回结果:
        //     引用异步关闭操作的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationObjectFaultedException:
        //     对处于 System.ServiceModel.CommunicationState.Faulted 状态的对象调用了 System.ServiceModel.ICommunicationObject.BeginClose()。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject 能够正常关闭之前所经过的指定超时。
        IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state);
        //
        // 摘要:
        //     开始一个异步操作以打开通信对象。
        //
        // 参数:
        //   callback:
        //     接收异步打开操作完成通知的 System.AsyncCallback 委托。
        //
        //   state:
        //     一个由应用程序指定的对象,它包含与异步打开操作相关联的状态信息。
        //
        // 返回结果:
        //     引用异步打开操作的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationException:
        //     System.ServiceModel.ICommunicationObject 无法打开并且已进入 System.ServiceModel.CommunicationState.Faulted
        //     状态。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject(已经进入 System.ServiceModel.CommunicationState.Faulted
        //     状态)能够进入 System.ServiceModel.CommunicationState.Opened 状态之前所经过的默认打开超时。
        IAsyncResult BeginOpen(AsyncCallback callback, object state);
        //
        // 摘要:
        //     开始一个异步操作以在指定时间间隔内打开通信对象。
        //
        // 参数:
        //   timeout:
        //     System.Timespan,指定在超时前必须完成发送操作的时间。
        //
        //   callback:
        //     接收异步打开操作完成通知的 System.AsyncCallback 委托。
        //
        //   state:
        //     一个由应用程序指定的对象,它包含与异步打开操作相关联的状态信息。
        //
        // 返回结果:
        //     引用异步打开操作的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationException:
        //     System.ServiceModel.ICommunicationObject 无法打开并且已进入 System.ServiceModel.CommunicationState.Faulted
        //     状态。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject(已经进入 System.ServiceModel.CommunicationState.Faulted
        //     状态)能够进入 System.ServiceModel.CommunicationState.Opened 状态之前所经过的指定超时。
        IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state);
        //
        // 摘要:
        //     使通信对象从其当前状态转换到关闭状态。
        //
        // 异常:
        //   System.ServiceModel.CommunicationObjectFaultedException:
        //     对处于 System.ServiceModel.CommunicationState.Faulted 状态的对象调用了 System.ServiceModel.ICommunicationObject.Close()。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject 能够正常关闭之前所经过的默认关闭超时。
        void Close();
        //
        // 摘要:
        //     使通信对象从其当前状态转换到关闭状态。
        //
        // 参数:
        //   timeout:
        //     System.Timespan,指定在超时前必须完成发送操作的时间。
        //
        // 异常:
        //   System.ServiceModel.CommunicationObjectFaultedException:
        //     对处于 System.ServiceModel.CommunicationState.Faulted 状态的对象调用了 System.ServiceModel.ICommunicationObject.Close()。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject 能够正常关闭之前所经过的超时。
        void Close(TimeSpan timeout);
        //
        // 摘要:
        //     完成一个异步操作以关闭通信对象。
        //
        // 参数:
        //   result:
        //     通过调用 System.ServiceModel.ICommunicationObject.BeginClose() 方法返回的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationObjectFaultedException:
        //     对处于 System.ServiceModel.CommunicationState.Faulted 状态的对象调用了 System.ServiceModel.ICommunicationObject.BeginClose()。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject 能够正常关闭之前所经过的超时。
        void EndClose(IAsyncResult result);
        //
        // 摘要:
        //     完成一个异步操作以打开通信对象。
        //
        // 参数:
        //   result:
        //     通过调用 System.ServiceModel.ICommunicationObject.BeginOpen() 方法返回的 System.IAsyncResult。
        //
        // 异常:
        //   System.ServiceModel.CommunicationException:
        //     System.ServiceModel.ICommunicationObject 无法打开并且已进入 System.ServiceModel.CommunicationState.Faulted
        //     状态。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject(已经进入 System.ServiceModel.CommunicationState.Faulted
        //     状态)能够进入 System.ServiceModel.CommunicationState.Opened 状态之前所经过的超时。
        void EndOpen(IAsyncResult result);
        //
        // 摘要:
        //     使通信对象从已创建状态转换到已打开状态。
        //
        // 异常:
        //   System.ServiceModel.CommunicationException:
        //     System.ServiceModel.ICommunicationObject 无法打开并且已进入 System.ServiceModel.CommunicationState.Faulted
        //     状态。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject(已经进入 System.ServiceModel.CommunicationState.Faulted
        //     状态)能够进入 System.ServiceModel.CommunicationState.Opened 状态之前所经过的默认打开超时。
        void Open();
        //
        // 摘要:
        //     使通信对象在指定时间间隔内从已创建状态转换到已打开状态。
        //
        // 参数:
        //   timeout:
        //     System.Timespan,指定在超时前必须完成发送操作的时间。
        //
        // 异常:
        //   System.ServiceModel.CommunicationException:
        //     System.ServiceModel.ICommunicationObject 无法打开并且已进入 System.ServiceModel.CommunicationState.Faulted
        //     状态。
        //
        //   System.TimeoutException:
        //     在 System.ServiceModel.ICommunicationObject(已经进入 System.ServiceModel.CommunicationState.Faulted
        //     状态)能够进入 System.ServiceModel.CommunicationState.Opened 状态之前所经过的指定超时。
        void Open(TimeSpan timeout);
    }
}

WAS托管:Windows激活服务(WAS)是一个系统服务,只适用于WINDOWS vista,是IIS7的一部分。

绑定   Binding

参考代码

<bindings>
      <wsHttpBinding>
        <binding name="WoDebinding" >
          <security mode="None"></security>
        </binding>
      </wsHttpBinding>
    </bindings>

一个绑定封装了诸如传输协议,消息编码,通信模式,可靠性,安全性,事务传播以及互操作性等相关选项的集合,使得他们保持一致。

绑定中的格式与编码

终结点

说白了就是提供服务的每一个对外接口。

<endpoint

name="endpoint1"

address=""

binding="wsHttpBinding"

contract="StreamTranlate.IService1"

bindingConfiguration="WoDebinding"  />    <!--注意啊,binding值不能乱写,只有固定的几个值,具体看上图-->

对于编程来说有意义的事情来了,编程方式配置终结点.

时间: 2024-11-05 22:05:55

【转】《WCF服务编程 第一章 WCF基础》第一回的相关文章

萌新向Python数据分析及数据挖掘 第一章 Python基础 第一节 python安装以及环境搭建 第二节 变量和简单的数据类型

本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 第一节 Python安装以及环境搭建 Python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不错的选择. Anaconda详细安装使用教程 https://blog.csdn.

WCF服务编程 读书笔记——第1章 WCF基础(1)

第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Binding).契约(Contract)和终结点(Endpoint):了解如何托管服务,如何编写客户端代码:了解WCF的相关主题,诸如进程内托管(In-Proc Hosting)以及可靠性的实现.即使你已经熟知WCF的基本概念,仍然建议你快速浏览本章的内容,它不仅能够巩固你的已有知识,而且本章介绍的一

WCF服务编程 读书笔记——第1章 WCF基础(2)

续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于HTTPGET的元数据,但需要显式地添加服务行为( Behavior)以支持这一功能.本书后面的章节会介绍行为的相关知识.现在,我们只需要知道行为属于服务的本地特性,例如是否需要基于HTTP-GET交换元数据, 就是一种服务行为.我们可以通过编程方式或管理方式添加行为.在例 1 - 10 演示的宿主应

WCF服务编程 读书笔记——第2章 服务契约

操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { int Add(int arg1,int arg2); double Add(double arg1,double arg2); } 然而,基于 WSDL 的操作却不支持操作重载.因此,在编译如下的契约定义时,装载服务宿主就会抛出 InvalidOperationException异常: // 无效的契

用jQuery的Ajax调用WCF服务编程心得

这两天在写基于WCF服务的后台框架,过程中遇到了一些挫折,经过努力全部解决了,在此分享给大家,使用的工具是Visual Studio 2013. 该后台需要支持通过json来传递和接收数据. 首先,说说搭建过程. 第一步:创建WCF服务应用程序项目WCF. 第二步,创建服务使用的数据类 using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Sch

wcf服务编程(二)

地址:      1.命名管道:用于同一台机器的跨进程通讯.URL表示方式为:net.pipe://  ;由于是在同一台机器的不同进程间通讯,所以不用定义端口号. wcf服务编程(二)

萌新向Python数据分析及数据挖掘 第一章 Python基础 (上)未排版

因word和博客编辑器格式不能完全对接,正在重新排版,2019年1月1日发出第一章完整版 本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 python安装以及环境搭建 python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

第一章 计算机基础知识

第一章 计算机基础知识 第一部分 概述 1.1946年2月15日,第一台计算机 ENIAC 2.物理原件(电子原件) 第一代:电子管.第二代:晶体管.第三代:中小规模集成电路.第四代:超大规模集成电路.第五代:超导材料.第六代:人工智能.#考试考到第四代. 3.计算机的分类 巨型机,大型机,中型机,小型机,微型机 现在的巨型机也是存在的 4.微处理器(CPU.中央处理器)由控制器.寄存器.运算器组成 第二部分 微机系统的组成 CPU>内存>外存 #速度 CPU和内存之间有一个CACHE,叫做高

APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构 从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境.内核的接口被称为系统调用.公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口 从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等) 1.3  shell shell是一个命令行解