Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。

  安装:在.net framework 3.0的时候已经内置了WCF。

  由于WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主。在本节将介绍2种服务寄宿服务,并分别通过Code和Config的方式为WCF服务绑定endpoint:

自我寄宿

1.建立项目

  • Service一个控制台应用,实现对wcf服务的寄宿,该项目引用System.ServiceMode程序集。(WCF框架的绝大部分实现和API定义在该程序集中)
  • Client一个控制台应用,实现对服务的调用端,该项目引用System.ServiceMode程序集。(生成的代理类继承自该程序集)

2.创建契约(contract)

  WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约。这里所指服务契约,用来声明服务的所有操作。

  要使一个接口成为一个契约,需要为其贴上特性标签。

using System.ServiceModel;

namespace Service
{
[ServiceContract]
public interface ICar
{
[OperationContract]
string Run(int distance);
}
}

  

3.实现服务

  实现接口方法即可

namespace Service
{
public class CarService : ICar
{
public string Run(int distance)
{
return "行驶了" + distance;
}
}
}

4.开始寄宿

  WCF采用终结点的通信方式。终结点包括Address,Binding,Contract,简称ABC。

Address:  指定wcf的location

Binging:  指定传输协议。(tcp http msmq等)

Contract:  指定服务的Behavior。

using System;
using System.ServiceModel; namespace Service
{
class Program
{
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(CarService)))
{
//指定服务的终结点,分别指定Contract,Binding,Address
host.AddServiceEndpoint(typeof(ICar), new BasicHttpBinding(), "http://localhost:10000/Car");
host.Open();
Console.WriteLine("服务启动成功");
Console.Read();
}
}
}
}

(已管理员身份启动Service.exe)

服务以及寄宿成功,那我们怎么调用呢。实际上,这样的方式是无法被调用的。客户端引用的地址是服务的元数据。所以我们需要把服务的元数据暴露出来。

using System;
using System.ServiceModel;
using System.ServiceModel.Description; namespace Service
{
class Program
{
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(CarService)))
{
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
//服务的元数据 允许Get方式从下面的Url中获取
var behavior = new ServiceMetadataBehavior
{
HttpGetEnabled = true,
HttpGetUrl = new Uri("http://localhost:10000/Car/Metadata")
};
host.Description.Behaviors.Add(behavior);
}
//指定服务的终结点,分别指定Contract,Binding,Address
host.AddServiceEndpoint(typeof(ICar), new BasicHttpBinding(), "http://localhost:10000/Car");
host.Opened += (o, e) => Console.WriteLine("服务启动成功");
host.Open();
Console.Read();
}
}
}
}

5.服务的调用

  服务的调用有2种方式,VS引用服务生成代理类,Code自定义代理类(需要保证Endpoint完全一致)。

Code自定义代理类:

using System;
using System.ServiceModel; namespace Client
{
class Program
{
static void Main(string[] args)
{
//一致的终结点
using (var channelFactory = new ChannelFactory<ICar>(new BasicHttpBinding(), "http://localhost:10000/Car"))
{
//手动创建代理类
var proxy = channelFactory.CreateChannel();
Console.WriteLine(proxy.Run(3));
}
Console.Read();
}
}
}

这里面的ICar(Contract),并非一定和wcf服务的ICar完全一致(指命名空间,所在程序集名称),只需方法签名一致即可。(由于是Contract仍需对应的特性)

using System.ServiceModel;

namespace Client
{
[ServiceContract]
interface ICar
{
[OperationContract]
string Run(int distance);
}
}

在管理员运行前面的Service.exe基础上,运行Client.exe。

IIS寄宿

1.建立项目

2.文件结构

3.svc文件

svc文件相当于asmx文件,通过一个必须指令Service,指定具体的服务。如Service="WcfService.Service1"

在vs中,浏览器查看svc文件,svc的地址就是服务的地址。svc的地址+?wsdl是服务描述的地址。

4.服务的调用

和自我寄宿的服务类似,只用将Address改成svc的地址即可。

注意,在新建svc文件的时候,vs会自动修改Web.config文件。(用来指定服务的元数据暴露行为)

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">//指定默认的behavior
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

Config

以上基本均采用Code的方式实现WCF,实际上WCF非常灵活,一般都采用Config方式。或者Config+Code(都会生效)。

wcf的配置涉及到2种,服务的发布,服务的调用。

发布:

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="meta">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:10001/Car/Metadata"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.CarService" behaviorConfiguration="meta">
<endpoint address="http://localhost:10001/Car" binding="wsHttpBinding" contract="Service.ICar"></endpoint>
<endpoint address="http://localhost:10001/Car2" binding="wsHttpBinding" contract="Service.ICar"></endpoint>
</service>
</services>
</system.serviceModel>

调用:

<system.serviceModel>
<client>
<endpoint name="car" address="http://localhost:10001/Car" binding="wsHttpBinding" contract="Client.ICar"></endpoint>
</client>
</system.serviceModel>

当调用端采用配置方式的时候,代码改成如下方式调用。(配置中name用来区分不同的endpoint,代码中也使用对应的name创建信道栈Channel)

using System;
using System.ServiceModel; namespace Client
{
class Program
{
static void Main(string[] args)
{
using (var cf = new ChannelFactory<ICar>("car"))
{
Console.WriteLine(cf.CreateChannel().Run(3));
Console.Read();
}
}
}
}

上述内容概述了wcf Code和Config2种方式。在实际开发中,可以更简单通过vs的引用服务生成代理类,配置wcf服务工具修改*.config。本文就不再赘述了。

代码下载:等待整理

本文作者:Never、C

本文链接:http://www.cnblogs.com/neverc/p/4682394.html

[Solution] 一步一步WCF(1) 快速入门的更多相关文章

  1. 一步一步搭建客服系统 (4) 客户列表 - JS($.ajax)调用WCF 遇到的各种坑

    本文以一个生成.获取“客户列表”的demo来介绍如何用js调用wcf,以及遇到的各种问题. 1 创建WCF服务 1.1 定义接口 创建一个接口,指定用json的格式:   [ServiceContra ...

  2. WCF 一步一步 发布 WCF服务 到 IIS (图)

    WCF 一步一步 发布 WCF服务 到 IIS (图) 使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用. 下面我们来看一下如何在IIS中部发布一个WCF服务. ...

  3. 一步一步学Silverlight 2系列(14):数据与通信之WCF

    一步一步学Silverlight 2系列(14):数据与通信之WCF   概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框 ...

  4. springMVC快速入门 共分为五步

    springMVC快速入门 共分为5步分别为: 1 导入依赖 ​​ 2 spring-mvc.xml 配置 ​ 3 web.xml配置 ​ 4 自定义一个核心控制类 ​ 5 页面配置 详细步骤以及代码 ...

  5. pytest封神之路第零步 快速入门

    背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest.如果你是从这篇文章第一次阅读,那么请忽略以上 ...

  6. 一步一步构建手机WebApp开发——页面布局篇

    继上一篇:一步一步构建手机WebApp开发——环境搭建篇过后,我相信很多朋友都想看看实战案例,这一次的教程是页面布局篇,先上图: 如上图所示,此篇教程便是教初学者如何快速布局这样的页面.废话少说,直接 ...

  7. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  8. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  9. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

随机推荐

  1. Jmeter属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...

  2. Win7任务栏图标大小调整为等宽

    打开注册表,找到HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics,新建DWORD,输入MinWidth,大图标设为56,小图标设定为36: 参 ...

  3. 关于ios中得路径详细讲解

    利用create groups for any added folders 这样的方式表示的是将所有的资源都放在资源包得路径下,没有层次的概念利用create folder references fo ...

  4. Navi.Soft30.开放平台.聚合.开发手册

    1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...

  5. 使用 jackson 解析 json 演示样例

    首先须要下载3个包,下载地址在Github FasterXML,这三个核心模块各自是: Streaming ("jackson-core") defines low-level s ...

  6. JavaMelody应用监控使用指南

    原文链接:http://www.cnblogs.com/xing901022/p/4116430.html 前言 本文参考JavaMelody的UserGuide编写,部分文字均来自文档,添加有个人理 ...

  7. MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)

    MVC .EF 学习有大半年了,用的还不是很熟练,正好以做这样一个简单的权限管理系统作为学习的切入点,还是非常合适的. 开发环境: VS 2013 + Git + MVC 5 + EF 6 Code ...

  8. bit操作 转

    http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/ Bit Hack #6. Turn off the ...

  9. 测试卡尔曼滤波器(Kalman Filter)

    真实的温度测试数据,通过加热棒加热一盆水测得的真实数据,X轴是时间秒,Y轴是温度: 1)滤波前 2)滤波后(p=10, q=0.0001, r=0.05, kGain=0;) 2)滤波后(p=10, ...

  10. Android之线程回掉更新ui

    一:工作线程中的回掉更新UI public class MainActivity extends AppCompatActivity { private int i; private Callback ...