WCF的全称是Windows Communication Foundation,从英文名称上看,WCF就是基于Windows下一种通讯的基础架构。利用WCF能够实现基于Windows下的各种通讯技术的开发以及应用。WCF是面向服务的,它是构建面向服务的系统设计。简化实现SOA的方法。WCF也是松耦合,并没有限制在特定协议、编码格式、或者主机环境上。还有WCF所有的选项都是可配置的。WCF也提供了非常好的可交互性,主要体现在两个方面,一个是支持Web Service的核心标准,另一个是在可扩展性方面能够快速适用新协议和更新。WCF强调了整合性,整合了Microsoft早期期技术。如COM、Enterprise Services,MSMQ。

本文就介绍下WCF入门以及宿主如何调用WCF服务。在这个例子中我们将使用VS 2012 创建一个WCF服务,其中会了解[DataContract] [ServiceContract] 等的特性以及通过内置的 WCFSVCHost ,并使用“WCF测试客户端”来测试我们创建的服务。最终在不同的宿主上调用该WCF。

  注意下面的所有类、接口及方法都添加了public 的访问级别。

1、 创建WCF服务库,如下图所示

在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。

2、新建类文件

在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“Person.cs”。

同时也要创建服务接口,声明对外发布的类和方法,名称为“IPersonService.cs”,再创建“PersonService.cs” 如下图所示:

其中,Person.cs提供所需要的模型。代码如下:

using System.Runtime.Serialization;

namespace WcfServiceLibrary1
{
[DataContract]
public class Person
{
[DataMember]
public string Id; [DataMember]
public string Name; [DataMember]
public int Age;
}
}

IPersonService.cs文件创建服务接口,声明对外发布的类和方法。代码如下:

using System.Collections.Generic;
using System.ServiceModel; namespace WcfServiceLibrary1
{
/// <summary>
/// ServiceContract:服务约定,代表我们所能操作的接口集合,提供功能点。
/// 在IPersonService接口上面,我们定义了[ServiceContract]标签,此标签代表此接口及实现此接口的类都是对外发布的Service类,
/// 在每个需要对外发布的方法上都加上[OperationContract]标签,以使外部可以访问到此方法。
/// [ServiceContract]和[OperationContract]这两个标签需要导入using System.ServiceModel命名空间。
/// </summary>
[ServiceContract]
public interface IPersonService
{
/// <summary>
/// OperationContract 操作约定,定义每个操作的接口点方法。
/// </summary>
[OperationContract]
void AddPerson(Person person); /// <summary>
/// 获取所有的实体的方法
/// </summary>
/// <returns></returns>
[OperationContract]
List<Person> GetAllPersons(); /// <summary>
/// 删除某个实体的方法
/// </summary>
/// <param name="id">实体id</param>
[OperationContract]
void RemovePerson(string id);
}
}

PersonService.cs文件实现我们上面声明的服务接口,实现对Person的添加、删除和检索的具体功能。代码如下:

using System;
using System.Collections.Generic;
using System.ServiceModel; namespace WcfServiceLibrary1
{
/// <summary>
/// 此类是对IBookService接口的具体实现,在此类的上面我们声明了[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]标签,
/// 此标签代表这个类采用SingleTone(单类模式)来生成对象。
/// 使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]接口需要导入using System.ServiceModel;命名空间。
/// </summary>
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService : IPersonService
{
List<Person> _Persons = new List<Person>();
public void AddPerson(Person person)
{
person.Id = Guid.NewGuid().ToString();
_Persons.Add(person);
} public List<Person> GetAllPersons()
{
return _Persons;
} public void RemovePerson(string id)
{
Person person = _Persons.Find(p => p.Id == id); _Persons.Remove(person);
}
}
}

然后进行编译。

3、配置服务并运行

到目前为至,我们建立好了WCF服务,那我们如何让WCFSVCHost(WCF服务主机)理解我们编写的服务类,并能够运行我们编写的服务呢。这需要我们在App.Config里面注册一下我们的WCF服务。

VS为我们提供了可视化的操作界面。

在项目中右击“App.Config”配置文件,在弹出的邮件菜单中选择“编辑WCF配置”,并打开,如下图所示:

在此界面中暴露两个对外的终结点(外部可以访问到的类或接口),其中下面一个是元数据终结点,用来向外提供服务信息的终结点。而另一个(即上面的终结点),是向外公布我们编写的[ServiceContract]的类,但我们可以看到它的Contract还是我们在第一步中删掉的WcfServiceLibrary1.IService1这个终结点。

不仅如此,在右侧上面的黑字的服务中还依旧是我们在第一步中删除的WcfServiceLibrary1.Service1服务。这说明虽然在第一步中我们删除了那两个自动生成的类文件,但配置文件中仍没有删除这两个类文件的配置信息。

下面我们把它们改变一下。

单击左侧的“服务”-“WcfServiceLibrary1.Service1”在右侧的Name,弹出“服务类型浏览器”对话框,在此类型中我们找到此WCF服务项目编译出来的WcfServiceLibrary1.dll文件,双击它就可以出现此服务中的对外公布的服务,点击选中它单击确定。如下图所示:

这样我们就可以把对外公司的服务改变为我们刚编写的服务了。 
然后,我们展开左侧“服务”->“WcfServiceLibrary1.PersonService”->“终结点”,单击第一个“空名称”,从右边的“终结点属性”中的Contract中我们可以看到,这里的Contract仍然用的是WcfServiceLibrary1.IService1。如下图所示:

我们按照上面的做法,找到此WCF服务项目编译出来的WcfServiceLibrary1.dll,双击它找到里面对应的ServiceContract点击确定就可以了。

重点一定要记着保存,点击菜单“文件”-“保存”就可以把我们对App.Config的修改保存回配置文件了。

App.Config代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服务库项目时,必须将配置文件的内容添加到
主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
<system.serviceModel>
<services>
<service name="WcfServiceLibrary1.PersonService">
<endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IPersonService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> </configuration>

4、通过WCFSVCHost 来测试WCF服务

在Visual Studio 中为我们提供了测试WCF的工具,按F5启动WCF会出现两个东西:
    一个是在右下角的托盘图标中会出现WCFSVCHost(WCF服务主机),它为我们在开发时候提供了一个运行WCF的服务器,用来为测试客户端提供WCF服务。如下图所示:

另一个是“WCF测试客户端”

“测试客户端”从WcfSVCHost中取得WCF服务的元数据,解析为左侧的“服务结构树”,从这里面我们可以看到此WCF服务为我们提供了一个服务契约“IPersonService”,此服务契约中对外提供了三个可调用的方法。如下图所示:

然后我们可以通过服务方法来测试。点击不同的方法进行测试,如下图所示:

在本例中我们看到,WCF作为面向对象和面向服务的桥梁 ,提供了非常方便的工具,无论是开发,配置还是测试,为我们可以快速的上手并提供面向服务的应用。你可以把WCF类库当作普通类库去做,但他提供了更强大的面向服务的特性。

5、后话

WCF的理论学习复杂程度远大于其的使用难度,而如果你是一名初学者,千万不要先陷入其复杂的理论学习中,花费很多的时间,而且看得晕头转向,最好先去实践,先去用,这样再去看WCF的深入概念和技术才会在大脑里面形成更好理解的印象和对应。下讲说明如何通过宿主来调用WCF服务。如果各位有疑问或者指教,请留言或者加群225109172,共同学习进步。

【WCF系列一】WCF入门教程(图文) VS2012的更多相关文章

  1. 转载:JMeter压力测试入门教程[图文]

    JMeter压力测试入门教程[图文] Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可 ...

  2. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  3. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句

    BIML 101 - BIML 快速入门教程 第一节 连接数据库执行SQL语句 本小节将用BIML建一个简单的可以执行的包. 新建一个biml文件,贴入下面的代码 1 <Biml xmlns=& ...

  4. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  5. Spring Boot 入门教程 | 图文讲解

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  6. WCF系列 Restful WCF

    由于项目需要,需要完成移动端与服务端以json格式的数据交互,所以研究了Restful WCF相关内容,以实现ios端,android端与浏览器端能够与后台服务交互. 那么首先我们来了解下什么是Res ...

  7. Ubuntu 16.04安装Oracle 11gR2入门教程图文详解

    概述 Ubuntu版本:ubuntu-16.04.3-desktop-amd64 Oracle版本:linux.x64_11gR2_database ------------------------- ...

  8. springBoot入门教程(图文+源码+sql)

    springBoot入门 1   springBoot 1.1 SpringBoot简介 Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运行一个Spr ...

  9. JMeter压力测试入门教程[图文]

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

随机推荐

  1. c++的string容器

    c++相比c的一个好处就是实现了很多的容器和泛型算法,使得程序员的工作得到了很大的化简.其中一个很有用的泛型容器就是string.string是一个类,是一个在STL里边实现好了的类,由于他的很多功能 ...

  2. oracle_根据ID(字符型)建立分区表

    方案思路:有一张暴增的数据表(10亿级别),以后需求需要提高单条查询性能, 这个表有个唯一ID, 假设是UUID,采用区分首字母的方法,不同字母的数据入到不同的物理文件中. 第一步: 查找数据库服务器 ...

  3. C#二维码生成与解码

    [窗体效果图] [程序源代码] using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  4. 怎么会Sql serverW数据库模型图转化成ord于--您还可以查看属性信息字段

    1. 于Sql server数据库,创建数据库模型图 -- Database Diagrams watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamN4NTA ...

  5. Msgbox消息框

    于"自"<软件开发工具>一本书有这样的制剂,让我回忆--程序员可以做,让用户做:它允许用户做的少,即使是那些谁需要做的程序设置.我们应该做的. 这不是宣言.该是践行. ...

  6. vs.net 2013 Saffolding功能扩展

    vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...

  7. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  8. JAVA基本的编程50称号(7-9称号)详细解释

    一个.叙述性说明 1.输入一行字符.在这些信件统计.空格.出现频率的数字和其他字符的总数和每一个字符.         程序分析:使用String类的matchs()分别统计符合正則表達式的每类字符的 ...

  9. MonkeyDevcie API 实践全记录

    1.    背景 使用SDK自带的NotePad应用作为实践目标应用,目的是对MonkeyDevice拥有的成员方法做一个初步的了解. 以下是官方列出的方法的Overview. Return Type ...

  10. EditPlus仿Sublime配色方案(三种任你选择)

    [Options] Placement=2C00000002000000030000000083FFFF0083FFFFFFFFFFFFFFFFFFFFEA000000EE000000D6050000 ...