WCF实例
vb实现三层结构及Wcf的入门实例(.net)

网上用来写三层结构和Wcf的实例不多,本人最近因为工作需要,简单学习了三层结构和Wcf服务,这里用 (vs 2010)作一个简单实例,希望能帮助一些需要的人快速入门。
网上关于三层结构和Wcf的解释都太专业和高大上,这往往会初学者带来困难。
这里用一些个人的理解作一些粗浅说明,各位配合下面的例子写出自己的代码后,再返回去看他们的专业定义,也许会更容易理解些。
所谓三层结构,按我的理解,就是把一个软件的开发,分成三块,一块专门作界面,一块专门作业务流程,一块专门作数据操作。
这在团队开发中非常有用,可以分工合作,一人作一部分,将来出错也好查错,维护起来也方便,特别是系统庞大了以后,作用更明显。
当然,如果是个人作个小软件,个人觉得什么界面、业务、数据还是放在一起吧,分层浪费的时间更多。
所谓的Wcf,我的简单理解就是为了实现三层结构中的数据层。
就是作一个数据操作的DLL,然后在网上发布这个DLL,别人调用这个DLL中的函数来实现功能,而不用管DLL是怎么写的。
那为什么不直接在自己的代码中写呢,而是要发布Dll到网上呢?答案是为了数据安全。
比如你要调用sql server中的数据库,客户端中如果使用了连接的用户名和密码,别人可以简简单单挂个小程序就把你的用户名、密码就截获了;而使用了wcf,数据库连接语句都是在服务器上进行,客户端只获得了返回的结果,显然就安全多了(平时我们浏览网页也是这种模式),还有一个好处就是如果这个数据的逻辑发生变化,更新服务器的DLL 文件就好,不需要再更新客户端了,比如某个算法,由原来的X*0.2调整为X*0.3,这个时候你也要客户端和你一起更新?这显然不经济。
当然如果你是作单机版的软件,在本机上运行的,就没有必要学wcf了。
下面会讲到Wcf的建立和在IIS 5.1上的发布,大家慢慢往下看。
以下的图例就不再作详细的文字描述了。
一、打开vs 2010,新建一个解决方案,名字为test,存在e:\mytest下二、左上角菜单->文件->添加->新建项目->windows->windows窗体应用程序,名称:界面层四、左上角菜单->文件->添加->新建项目->Wcf->Wcf服务库,名称:数据层。
WCF开发实战教程

WCF开发实战系列教程1:创建第一个WCF服务在这个实战中我们将使用DataContract,ServiceContract来构建WCF服务,并使用VS2008内置的“WCFSVCHost”运行我们创建的WCF服务,并使用“WCF测试客户端”来测试我们创建的服务。
在此WCF服务中我们将建立一个关于Book的服务,并实现对Book的添加、删除和检索操作。
第一步:创建“WCF服务库”“文件(F)”->“新建项目(P)...”打开新建项目对话框。
在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”。
在下面的“名称”文本框中,填写我们要创建的WCF服务库的项目名称“Services”。
《图1》点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService.cs”和“Service.cs”。
《图2》这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。
第二步:创建Book实体类在“解决方案窗口”中,我们右击Services项目名,选择“添加”,再单击“类”《图3》在弹出的“添加新项”窗口中,选择“类”,并在“名称”文本框中写入项名称“Book.cs”。
《图4》第三步:为Book实体类编写代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;namespace Services{[DataContract]public class Book{[DataMember]public string BookNO;[DataMember]public string BookName;[DataMember]public decimal BookPrice;}}为了保证此类在WCF调用中能够被序列化,我们在Book类上面加入[DataContract]标签,在每个需要序列化的成员变量上加入[DataMember]标签。
WCF原理揭秘篇5

本系列先后通过《实例篇》、《概念篇》、《协议篇》和《编程篇》对WCF的可靠会话进行了详细探讨。
作为本系列的最后一片,我们将深入到WCF的可靠会话体系的最底层,对实现可靠会话的实现原理进行深入剖析。
如果读者仔细阅读本系列博文,相信会使读者对可靠会话的理解提升到一定的高度。
从《编程篇》中,我们不难看出可靠会话的编程仅仅围绕着一个对象,那就是绑定。
绑定在整个WCF架构模型具有重要的地位。
WCF整个架构模型由两部分构成,即服务模型(Service Model)层和信道(C hannel)层,而绑定是信道层的缔造者,同时也是连接两个层次的纽带。
对可靠会话的实现,是完全在信道层实现的。
绑定是由一系列绑定元素的有序组合,不同的保定元素具有各自的目的,而实现可靠会话的是一个叫做R eliableSessionBindingElement的绑定元素。
在《WCF技术剖析(卷1)》的第3章对绑定模型的介绍中我们知道,绑定元素的主要任务是用于对信道管理器(Channel Manager)的创建。
具体来说,在客户端和服务端分别创建信道工厂(Channel Factory)和信道监听器(Channel Listener)。
由所有信道工厂和信道监听器创建的信道按照其创建者的顺序构建起一个消息处理的通道。
WCF通过最终通过ReliableSessionBindingElement创建可靠会话信道(Reliable Session Channe l,以下简称RS信道),提供对可靠消息传输的实现。
在WS-RM定义的可靠消息传输模型中,可靠消息传输是在RM源和RM目的地之间进行的,在这里,你可以将客户端和服务端的RS信道看成是RM源和RM目的地。
一、可靠会话信道层模型图1反映的是可靠会话在信道层的实现模型,从中我们可以看出可靠会话建立在客户端和服务端的RS信道之间。
作为客户端或者服务端信道栈中的一员,RS信道在信道栈中位置由ReliableSessionBindingEl ement在绑定元素集合中的位置决定。
基于WCF与P2P的分布式大规模考试平台实例研究

E m i x l c c e. - a :  ̄ @c c . t n l n c
ht / tp:www.nz .e .n / d sn tc Te : 6— 一 90 63 5 0 4 l+8 55l 56 9 69 96
C m ue K o l g n e h o g o p tr n we ea dT c n l y电脑 知识 与技术 d o
中 图分 类 号 : P 1 T 31
文 献标 识 码 : A
文 章编 号 :0 9 3 4 (0 10 — 5 6 0 1 0 — 0 42 1 )7 1 6 — 3
Th r e S ae Dit i u e a n t n Pl t r Ba e i W CF a d P2 eLa g c l srb t d Ex mi a i a f m s d O l o o n P
LI AN G u,ZH EN G e i W D ~q ng
( p r n fnom ain Teh oo y o a g o gIs tt o u l miit t n Gu n z o 0 5 , ia De at t fr t c n lg f me o I o Gu n d n ntue f bi Ad ns ai , a gh u 5 0 3 Chn ) i P c r o 1
Vo ,No7 l 7 . ,Ma c 0 ,P.5 6 5 8 r h 2 1 P 1 6 —1 6 1
基于 WC F与 P P的分 布 式大 规模考 试 平 台实例 研 究 2
梁 .德 武郑 庆
( 东行 政 学 院 信 息 技 术 教 研部 , 东 广 州 50 5 ) r 广 10 3
1WCF蒋金楠

作为一个通信基础平台,WCF必须保证通信的可靠性。
由于消息交换是WCF采用的通信手段,通信可靠性的保障体现在确保消息的可靠传输。
WCF本质上是一个消息处理框架,作为整个消息交换系统的两个终端,即发送端和接收端。
换句话说,WCF仅仅负责对消息的发送和接收,一旦消息通过WCF的信道层进入了网络,就脱离了WCF的控制范围。
但是,由于网络环境的限制,网络层不能百分之百地确保对消息的有效交付。
如何克服中间环节的制约,确保从一端发送的消息能够被有效地交付给另一端,这就是可靠消息传输(Reliable Messaging)需要解决的问题。
WCF通过可靠会话(Reliable Sessions)实现了种种端到端(End to End)的可靠消息传输。
【实例篇】为了让读者对可靠会话的作用现有一个直观的认识,我们先来做一个很有意思的实例演示。
这也是早年微软推广WCF技术频繁使用的案例:图片传输。
在客户端,我们选择一张图片,并对它进行切片,最后通过调用WCF服务将每一个切片依次传输到服务端。
服务端则按照切片被接收到的顺序重新组装成一张完整的图片。
如果中间有任何一张切片丢失,服务端最终组装图片将不会完整;如果服务端切片接收的次序和发送顺序不一致,将会造成组装后的图片并不能还原其发送前的模样。
在这里,我们充分利用了W CF中的可靠会话提供了可靠而有序的消息交付…不稳定的网络是造成消息丢失最主要的因素,但是在本机环境下模拟不稳定的网络是一件比较困难的事情。
但是,虽然我们不能让消息在网络传输层中丢失,但是我们可以让它在WCF的信道层中丢失。
如何实现这样的目的呢,相应阅读过《WCF技术剖析(卷1)》第3章的读者会很快想到可以采用自定义信道的方式。
步骤一:通过自定义信道模拟不稳定的网络为了对网络传输过程中的丢包率能够进行动态控制,我特意创建一个特殊的类型MessageInspector。
M essageInspector定义如下,只读属性DropRate表示丢包率,ProcessMessage对传入的消息进行处理,如果返回为Null,意味着消息的丢失。
WCF接口实例介绍

WCF接⼝实例介绍Windows Communication Foundation(WCF)是由微软开发的⼀系列⽀持数据通信的应⽤程序框架,可以翻译为Windows 通讯开发平台。
WCF整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有和的相关技术。
简单的归结为四⼤部分1>.⽹络服务的协议,即⽤什么开放客户端接⼊。
2>.业务服务的协议,即声明服务提供哪些业务。
3>.数据类型声明,即对客户端与服务器端通信的数据部分进⾏⼀致化。
4>.传输安全性相关的定义。
下⾯直接看⼀个例⼦:⼀.服务端实例1.定义⼀个WCF接⼝名称未Ichangeline服务契约(ServiceContract),订定服务的定义。
// 注意: 使⽤“重构”菜单上的“重命名”命令,可以同时更改代码和配置⽂件中的接⼝名“IStaffLoginCheckService”。
[ServiceContract] //服务协定定义public interface IChangeline{[OperationContract] // 操作服务定义string EsopCheckOk();[OperationContract]string HelloWorld();}2.定义⼀个类实现接⼝名称Changeline// 注意: 使⽤“重构”菜单上的“重命名”命令,可以同时更改代码和配置⽂件中的类名“StaffLoginCheckService”。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]public class Changeline : IChangeline{public string HelloWorld(){string result = "123456";return result;}}3.开通WCF所需要的服务,也可以从VS直接添加WCF服务1#region启动WCF服务2private void OpenWcfService()3 {4try5 {6var changeline = new Changeline(bendview);7 host = new ServiceHost(changeline, new Uri("http://localhost:8734/MyService/"));8//这是我们服务的地址9 host.AddServiceEndpoint(typeof(IChangeline), new BasicHttpBinding(), string.Empty);10 host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });11//mex元数据的地址12 host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),13"mex");14 host.Open();15var port = "8734"; //获取端⼝号16var inname = "Changeline"; //打开端⼝号的名称17var str = " netsh advfirewall firewall add rule name=" + inname +18" dir=in action=allow protocol=TCP localport= " + port;19var pro = new Process(); //实例化进程20 pro.StartInfo.FileName = "cmd.exe"; //设置要运⾏的程序⽂件21 eShellExecute = false; //是否使⽤操作系统shell程序启动22 pro.StartInfo.RedirectStandardInput = true; //是否接受来⾃应⽤程序的调⽤23 pro.StartInfo.RedirectStandardOutput = true; //是否接受来⾃应⽤程序的输出信息24 pro.StartInfo.RedirectStandardError = true; //是否接受重定向错误信息25 pro.StartInfo.CreateNoWindow = true; //不显⽰窗⼝信息26 pro.Start(); //启动程序2728//向cmd窗⼝发送输⼊信息29 pro.StandardInput.WriteLine(str + "&exit");3031 pro.StandardInput.AutoFlush = true;32 pro.WaitForExit(); //等待程序运⾏完退出程序33 pro.Close(); //关闭进程34 }35catch (Exception ex)36 {37 Tool.Log.Error("WCF开起失败:" + ex.Message);38 }39 CheckWCFServerTh = new Thread(WCF_HostCheck);40 CheckWCFServerTh.IsBackground = true;41 CheckWCFServerTh.Start();42 }43void WCF_HostCheck(object o)44 {45//Closed 指⽰通信对象已关闭,且不再可⽤。
[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)
![[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)](https://img.taocdn.com/s3/m/e919512110661ed9ad51f34a.png)
[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)在采用TLS/SSL实现Transport安全的情况下,客户端对服务证书实施认证。
但是在默认情况下,这种认证仅仅是确保服务证书的合法性(通过数字签名确保证书确实是由申明的CA颁发)和可信任性(证书或者CA证书存储于相应的可信赖存储区)。
而WCF提供服务证书并不限于此,客户端对服务认证的模式应该是这样的:服务端预先知道了服务的身份,在进行服务调用之前,服务端需要提供相应的凭证用以辅助客户端确认调用的服务具有预先确定的身份。
对于这样的服务认证模式,具有两个重要的概念,即服务凭证和服务身份。
目录:一、服务凭证(Service Credential)二、服务身份(Service Identity)三、服务凭证协商(Service Credentials Negotiation)一、服务凭证(Service Credential)认证就是通过对对方提供的凭证进行检验以确定对方身份的一个过程,从这个意义上讲服务认证和客户端认证并没有本质的区别。
但有服务认证确实有一点和客户端认证不同:客户端在对服务进行认证之前就预先确定了服务应当具有的身份。
而在真正进行服务调用的时候,客户端要求服务提供相应的凭证。
而客户端根据这个凭证和实现确定的身份进行比较,从而确定当前正在调用的服务正是自己希望调用的那个。
通过上面一节的介绍,我们已经知道了客户端具有多种形式的凭证类型,但是服务凭证具有两种典型的类型:Windows凭证和X.509证书。
服务凭证的类型决定了认证方式,所以服务认证通过Windows认证或者对X.509证书的检验来实现。
而Windows认证具有两种具体的实现,即Kerberos和NTLM。
通过前面对Kerberos和NTLM 的介绍,你应该知道只有Kerberos支持双向认证,而NTLM则不能。
因此,只有在基于域(Domain)的网络环境中,基于Windows认证的服务认证才是可行的。
JAVA与C#平台通信 WCF CXF SOAP

问题提出:采用的方案:Java和C#的互操作性,采用基于Soap的通信协议什么是WCF根据微软官方的解释,WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。
它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。
WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ。
以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于Internet;以宿主程序而论,可以以,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。
WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML,Kerberos,X509,用户/密码,自定义等多种标准与模式。
/antswallowWCF平台搭建JAVA调用WCFDynamicClientFactory dcf=DynamicClientFactory.newInstance();org.apache.cxf.endpoint.Client client=dcf.createClient("http://localhost:37563/WebSite4/Service.asmx?wsdl"); Object[]reply=client.invoke("HelloWorld",new Object[]{});System.out.println("Server said:"+reply[0].toString());详见:/Apache CXF=Celtix+XFire,Apache CXF的前身叫Apache CeltiXfire,现在已经正式更名为Apache CXF了,以下简称为CXF。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.2Hello, World实例
本实例与传统入门教材相同,仍然以输出一个“Hello,World”字符串开始。
实例将新建2个项目,第一个项目名为“HelloWorldService”,它提供WCF服务,并且以开发环境方式暴露一个端口供客户端调用;另外一个项目叫“HelloWorldClient”,它调用WCF服务方法,并输出返回值。
本实例的运行结果如图所示:
8.2.1创建WCF服务端程序
1)打开Microsoft Visual Studio 2010;
2)选择菜单>文件>新建>项目;
3)在弹出的“新建项目”对话框中展开左边的“已安装的模板”>Visual C#;
4)选择“WCF”;
5)在对话框右边选择“WCF Service Application“;
6)在对话框下部的“项目名“中输入”HelloWorldService“,在位置中输入” d:\Exercise “,在解决方案名称输入”WcfSample“,确保选中”Create directory for solution “,确保未选中”Add to source control“,设置后的界面如下:
7)点击“OK“按钮,VS2010已自动建立了一个WCF Service Application,并且为我们自动打开了Service1.svc.cs文件;
8)打开“Solution Explorer”;(VS2010默认打开,位置在VS2010桌面的右边,如果VS2010没有打开,请使用快捷键Ctrl + W,S打开)
9)在“Solution Explorer”中展开“HelloWorldService”;
10)双击“IService1.cs”文件;
11)用下面的代码
/// <summary>
/// 提供一个WCF服务方法
/// </summary>
/// <returns>返回“Hello, World!”</returns>
[OperationContract] //声明为“OperationContract”的方法将暴露在WCF服务器上
string GetHelloWorld();
替换第22行的注释
// TODO: Add your service operations here
知识点:
“ServiceContract”代表服务契约,表示IService1接口是一个WCF服务,这样,客户端就可以访问这个接口和它内部有效的方法了。
“OperationContract”代表操作契约,表示GetHelloWorld方法是服务契约中的一个方法,只有声明为“OperationContract”的方法才会被公开在WCF服务中。
如果服务中没有任何一个方法声明为“OperationContract”,那么这个服务将没有任何意义。
12)右键点击HelloWorldService项目,在弹出的菜单中选择“Build”,VS2010会在“Error List”中提示“Error 1'HelloWorldService.Service1' does not implement interface member'HelloWorldService.IService1.GetHelloWorld()'
d:\Exercise\WcfSample\HelloWorldService\Service1.svc.cs 12 18
HelloWorldService”;
13)在“Error List”对话框中双击错误项,系统会自动打开“Service1.svc.cs”文件;14)在打开的“Service1.svc.cs”文件中选择“IService1”并右击;
15)在弹出的右键菜单中选择“Implement Interface“>”Implement Interface “,VS2010会自动在文件后面生成如下代码:
public string GetHelloWorld()
{
throw new NotImplementedException();
}
16)用
return "Hello, World!";
替换
throw new NotImplementedException();
17)重复第12步,VS2010将不会报任何编译时错误了;
18)选择“HelloWorldService“项目并右击,在弹出的菜单中选择”Properties“,系统会展示项目属性界面,如下图:
19)选择左边“Web“项,在右边展示的选择中选择“Service”>“Use Visual Studio Development Server”>“Specific port”;
20)在“Specific port“后面的文本框中输入“2027”,设置正确的界面如下:
21)展开“HelloWorldService”项目;
22)选择“Service1.svc“文件并右击,在弹出的菜单中选择“View in Browser”,如果正确的话,应在浏览器中出现如下界面:
23)如此,服务器端已完成了;
8.2.2创建WCF客户端程序
服务器端的服务写好了,我们再来了解客户端是如何调用的。
1)打开上一节创建的WcfSample解决方案;
2)右击解决方案WcfSample;
3)在弹出菜单中选择“Add”>“New Project”;
4)在弹出的“Add New Project”对话框中左边展开“Installed Templates”;
5)选择“Visual C#”,并在对话框可边选择“Console Application”;
6)在对话框下部的“Name”中输入“HelloWorldClient”,并且中“Location”中输入“D:\Exercise\WcfSample”,界面如下:
7)点击“OK”按钮,VS2010会自动在“WcfSample”解决方案下生成HelloWorldClient 项目;
8)到此,WCF客户端就创建好了;
8.2.3在客户端添加WCF引用
在开始前,请重复第一节(创建WCF服务端程序)第18步至22步,运行WCF服务(请确保运行正常)。
1)打开WcfSample解决方案;
2)展开HelloWorldClient项目;
3)右击“References”,在弹出的菜单中选择“Add Service References…”;
4)在弹出的对话框的“Address”中输入WCF服务地址“http://localhost:2027/Service1.svc”
(也许您的WCF运行地址不相同,请输入您的正确地址)
5)点击“Go”按钮,系统会自动展示WCF服务端的相关服务接口;
6)在对话框的下部的“Namespace:”中输入“HelloWorldService”,完整的界面如下;
7)点击“OK”按钮完成添加引用操作,系统会自动在“HelloWorldClient”项目下添加“Service References”文件夹,并添加了关于“HelloWorldService”的引用,如图:
8)至此,WCF引用就添加完了;
8.2.4调用WCF服务
准备工作已经完成,下面我们来看看如何调用WCF提供的GetHelloWorld方法呢。
步骤如下:
1)打开WcfSample解决方案;
2)展开“WcfSample”>“HelloWorldClient”,双击打开“Program.cs”文件,系统将展示大家熟悉的界面:
3)在Main方法中添加如下代码:
//实例化一个WCF代理对象
Service1Client client = new Service1Client();
//获取从WCF服务方法返回的值
string result = client.GetHelloWorld();
//将GetHelloWorld方法返回值输出到屏幕
Console.WriteLine(result);
4)如果“Program.cs”文件没有添加对“HelloWorldClient.HelloWorldService”的引用,请在“Program.cs”文件的引用代码块的最后一行加入如下代码:
using HelloWorldClient.HelloWorldService;
5)右击“HelloWorldClient”,在弹出菜单中选择“Set as Startup Project”将其设置为启动项目;
6)按Ctrl + F5运行程序,运行界面如下:
7)如此,本实例已全部完成了。