本随笔参考自WCF编程系列(一)初识WCF,纯属读书笔记,加深记忆。

1、简介:Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型。在WCF之前,.NET Framework提供了多种分布式技术,如ASP.NET Web服务、.NET Framework远程处理、企业服务、WSE以及Microsoft消息队列。一般我们在编写一个应用程序时通常会同时使用多项技术,所以,微软将这些分布式应用程序集成到了一起,形成了WCF这个框架。即通过WCF能实现上面所有的分布式功能。

2、WCF的基本组成

(1)、地址:定义服务的地址,也就是服务接口所在地的IP地址

(2)、绑定:定义服务的通讯方式(传输协议、编码方案)

(3)、契约:定义服务的具体实现

(4)、终结点(endpoint):由地址、绑定、契约共同构成一个终结点,服务器通过终结点向客户端公开服务,客户端通过终结点来调用服务。

注:WCF是面向接口编程

3、简易demo

(1)、第一步

i、首先创建一个IService类库(服务层)。

ii、引用引入System.ServiceModel命名空间和当前解决方案的Service命名空间和IService命名空间

iii、然后在服务层下面新建一个服务接口IUserInfoService,并在该接口上添加[ServiceContract]特性(及服务契约),表明该接口是一个服务

iiii、在接口中定义Add方法,并在方法上添加[OperationContract]特性,表示Add方法是IUserInfoService服务接口的一个服务方法,客户端可远程调用该方法

using System;
using System.ServiceModel; namespace IService
{
[ServiceContract]
public interface IUserInfoService
{
[OperationContract] //相当于WebService中的[WebMethod]特性标签
int Add(int a, int b);
}
}

(2)、第二步

i、创建一个Service类库(服务层的具体实现)

ii、实现服务层中的所有方法

using System;
using IService; namespace Service
{
public class UserInfoService : IUserInfoService
{
public int Add(int a, int b)
{
return a + b;
}
}
}

ok,到这里服务端的WCF服务创建完成

(3)、第三步,个人觉得是WCF最重要的一步,同时也是提现它功能强大的地方之一,提供WCF服务的宿主(它的宿主可以使任何应用程序,包括Web应用程序、控制台、Windows Form程序),这里使用控制台程序。

宿主程序:WCF通过改程序向外部发布服务,也就是说改程序必须保持启动的状态,否则WCF中的服务,外界将无法获取。

i、创建一个控制台程序Host,作为WCF的宿主程序

ii、引入System.ServiceModel命名空间和IService命名空间和Service命名空间

iii、通过下面的代码启动WCF服务

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks; namespace Host
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Service.UserInfoService))) {
host.Open();
Console.WriteLine("服务器启动成功");
Console.ReadLine();
}
}
}
}

当然,现在肯定启动不了,因为最重要的配置文件,还没有设置。使用WCF大部分时间,都在配配置文件。

(4)、第四步,编写WCF宿主的配置文件app.config,来配置我们的WCF程序

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.UserInfoService" behaviorConfiguration="behaviorConfiguration">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="IService.IUserInfoService"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

ok,所有的准备工作都以就绪,现在重新生成整个解决方法。右键Host,打开其本地文件夹,找到Host.exe程序,启动服务,注意不要关闭。

(5)、第五步,测试WCF服务是否能正常使用,有两种方法可供测试

i、打开浏览器输入服务地址:http://localhost:8000/,这个地址是我们在app.config文件中配置的UserInfoService服务的地址

ok,说明WCF服务端已经启动客户端可以正常调用

ii、使用vs2010以上的自带的WCF测试工具,通过这个工具,也可以测试当前服务是否正常启动。

输入服务地址,点击确定。

说明服务正常启动。

(6)、第六步,客户端访问,在确认服务端正常启动后,下面就要通过客户端来测试服务能否正常调用

i、创建一个名为Client的客户端控制台程序

ii、生成客户端代理类,通过代理类来调用服务端程序,生成客户端代理类有两种方式(我知道的),

第一种:通过微软的svcutil工具生成UserInfoService服务的客户端代理类,开始菜单/Microsoft Visual Studio 2012/Visual Studio Tools/Visual Studio 2012开发人员命令提示

打开该工具,在工具中定位到当前需要调用WCF服务的客户端目录下,然后输入

svcutil http://服务地址/?wsdl /o:客户端文件名.cs,,回车,在回车前需确认WCF服务端是开启的。回到Client项目,选择添加 现有项 ,然后选择这两个文件,添加后,将output.config重命名为App.config,ok,文件初始化完成,第一种方法介绍完毕,下面通过代码测试,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Client
{
class Program
{
static void Main(string[] args)
{
UserInfoServiceClient client = new UserInfoServiceClient();
Console.WriteLine(client.Add(, ));
}
}
}

ok,说明Client调用WCF服务成功!

  第二种方法:这种方法,仅限于Web客户端的调用,新建一个空Web应用程序,右击添加服务引用

,输入服务地址http://localhost:8000/,点击添加。

ok,客户端代理类添加成功。下面通过代码测试,当前Web项目能否正常使用WCF服务端服务,新建Web窗体,修改后台代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.ServiceReference1; namespace Web
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
UserInfoServiceClient client = new UserInfoServiceClient();
Response.Write(client.Add(1, 2));
}
}
}

运行当前窗体,,ok,说明everything is ok.

WCF系列教程之初识WCF的更多相关文章

  1. 无废话WCF系列教程 -- 李林峰

    李林峰的无废话WCF入门教程 无废话WCF入门教程一[什么是WCF] 无废话WCF入门教程二[WCF应用的通信过程] 无废话WCF入门教程三[WCF的宿主] 无废话WCF入门教程四[WCF的配置文件] ...

  2. 【转】无废话WCF系列教程

    转自:http://www.cnblogs.com/iamlilinfeng/category/415833.html     看后感:这系列的作者李林峰写得真的不错,通过它的例子,让我对WCF有了一 ...

  3. WCF系列(六) - WCF安全系列(一) - basicHttpBinding

    绑定可指定在与终结点通话时所使用的通信机制,并指示如何连接到终结点.绑定由一些元素组成,这些元素指定如何对 Windows Communication Foundation (WCF) 通道进行分层以 ...

  4. WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

    1.使用WCF请求与答复模式须知 (1).客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2).相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后 ...

  5. WCF系列教程之客户端异步调用服务

    本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆 一.简介 在前面的随笔中,详细的介绍了WCF客户端服务的调用方法 ...

  6. WCF基础教程——vs2013创建wcf应用程序

    引言   近期在项目中见到了师哥们常常谈到的WCF这方面的知识.当时在写程序的时候也没有理解wcf究竟是个什么东西? 以及我们为什么在项目中会採用这种框架来实现,仅仅是依照师哥他们写好的代码编写同样格 ...

  7. WCF系列教程之WCF消息交换模式之单项模式

    1.使用WCF单项模式须知 (1).WCF服务端接受客户端的请求,但是不会对客户端进行回复 (2).使用单项模式的服务端接口,不能包含ref或者out类型的参数,至于为什么,请参考C# ref与out ...

  8. WCF系列教程之WCF服务配置工具

    本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...

  9. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

随机推荐

  1. Ubuntu 将应用程序 固定到快快速启动栏(以Sublime为例)

    因为Sublime Text并不是需要安装,所以缺少Ubuntu桌面运行的一些基本配置,比如不能将它加入桌面侧边的启动器. 而Ubuntu上也没有快捷方式的说法,而通过软件中心安装的软件就有图标,并能 ...

  2. VC++下的Unicode编程

    ASCII是用来表示英文字符的一种编码规范.每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH). 其实,英文字符并没有那么多,一般只用前128个(00H ...

  3. 键盘控制背景边框平滑移动(jquery)

    今天同事让我看了一个动画效果,是由键盘控制背景边框平滑移动,我感觉挺cool,所以我自己也动手制作了一个.目的是为了锻炼自己,看自己是否也能在短时间内实现. 先上图: 一.html代码 <!DO ...

  4. wp8.1启动协议

    var uri = new Uri(string.Format(@"ms-windows-store:navigate?appid={0}", appid));商店根据appid跳 ...

  5. RobotFramework关键字返回参数

    业务关键字[登录]返回参数 调用时直接把return的参数值写在业务关键字的最前面,就可以使用关键字的返回值了

  6. /Date(1512551901709+0800)/转换

    var convertDT=function(dt) { dt.replace(/Date\([\d+]+\)/, function (a) { eval('d = new ' + a) }); al ...

  7. base64编码问题

    最近遇到一个很奇怪的问题:post方式上传文件,因为文件不大,所以直接base64后作为参数扔给服务器.一开始好用,后来出问题了,上传的压缩包再下载后,能双击打开看到压缩包里面的文件,但是解压就报错, ...

  8. 百万数据测试 Entity Framework 到底有多慢

    测试环境 硬件:阿里云乞丐配置 操作系统:Centos 7 CPU: 1核 内存:1 GB (I/O优化) 网络:1Mbps(峰值) 软件 .net core 2.0 ZKEACMS For .net ...

  9. system idle process

    偶然发现windows环境任务管理其中存在进程 system idle process,cpu占用极大但内存占用很小.google了一下,保存下结果 system idle process :系统空闲 ...

  10. 开发者都应该使用的10个C++11特性

    摘要: 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的 ...