WCF实例

合集下载

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

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开发实战教程

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原理揭秘篇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的分布式大规模考试平台实例研究

基于WCF与P2P的分布式大规模考试平台实例研究
IS 10 - 0 4 S N 0 9 3 4
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蒋金楠

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接口实例介绍

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)

[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#平台通信 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。

一个WCF使用TCP协议进行通协的例子

一个WCF使用TCP协议进行通协的例子

⼀个WCF使⽤TCP协议进⾏通协的例⼦ 之前写的例⼦都是基于http协议的,但在局域⽹环境下,我希望可以获取更⾼的传输性能和更低的服务端资源占⽤,所以我尝试使⽤TCP协议来进⾏传输。

⽹上的例⼦都讲得⾮常复杂,但终于让我找到⼀个简单的实现⽅法,记录如下:⼀、建⽴WCF服务 ⾸先建⽴⼀个WCF服务库,名称为"WCFService",解决⽅案名称为"WCFDemo",同时"为解决⽅案创建⽬录"要勾上。

确定后VS会⾃动创建⼀个IService1接⼝和Service1程序⽂件,不过由于这个例⼦是演⽰如何使⽤TCP协议的,所以我们就不再作任何修改。

⼆、建⽴宿主程序 在解决⽅案上按右键,选择"添加" -> "新建项⽬",然后新建⼀个Windows 窗体应⽤程序,程序名称为"WCFHost"。

在解决⽅案资源管理器中,需要添加两个引⽤:System.ServiceModel和WCFService。

然后双击窗⼝,在Form_Load事件中编写如下代码: 添加⼀个应⽤程序配置⽂件App.Config,然后粘贴如下内容:<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><bindings><netTcpBinding><binding name="TcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"transferMode="Buffered" transactionProtocol="OleTransactions"hostNameComparisonMode="StrongWildcard" listenBacklog="10"maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"maxReceivedMessageSize="65536"><readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"maxBytesPerRead="4096" maxNameTableCharCount="16384" /><reliableSession ordered="true" inactivityTimeout="00:10:00"enabled="false" /><security mode="Transport"><transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /><message clientCredentialType="Windows" /></binding></netTcpBinding><wsDualHttpBinding><binding name="HttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"transactionFlow="false" hostNameComparisonMode="StrongWildcard"maxBufferPoolSize="524288" maxReceivedMessageSize="65536"messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"><readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"maxBytesPerRead="4096" maxNameTableCharCount="16384" /><reliableSession ordered="true" inactivityTimeout="00:10:00" /><security mode="Message"><message clientCredentialType="Windows" negotiateServiceCredential="true"algorithmSuite="Default" /></security></binding></wsDualHttpBinding></bindings><client><endpoint address="net.tcp://localhost:8000/service" binding="netTcpBinding"bindingConfiguration="TcpBinding" contract="ServiceReference1.IService1"name="TcpBinding"><identity><userPrincipalName value="OverBlue-PC\OverBlue" /></identity></endpoint><endpoint address="http://localhost:8001/service" binding="wsDualHttpBinding"bindingConfiguration="HttpBinding" contract="ServiceReference1.IService1"name="HttpBinding"><identity><userPrincipalName value="OverBlue-PC\OverBlue" /></identity></endpoint></client></system.serviceModel></configuration>对于这个配置⽂件,我是这样理解的:1、baseAddress:由协议、地址和端⼝三个部分组成。

winform中使用corewcf使用实例

winform中使用corewcf使用实例

winform中使用corewcf使用实例使用CoreWCF 在WinForms 中创建WCF 服务的步骤如下:1. 创建WinForms 项目:- 在Visual Studio 中,选择"新建项目"。

- 在"模板" 中选择"Windows Forms 应用程序"。

- 指定项目名称和位置,然后点击"创建"。

2. 添加CoreWCF 引用:- 在解决方案资源管理器中,右键单击"引用",然后选择"管理NuGet 引用"。

- 在"NuGet 管理器" 中搜索"CoreWCF"。

- 选择"CoreWCF",然后点击"安装"。

3. 创建WCF 服务契约:- 在解决方案资源管理器中,右键单击项目,然后选择"添加" -> "新建项"。

- 在"添加新项" 窗口中,选择"WCF 服务契约"。

- 指定服务契约名称,然后点击"添加"。

4. 定义服务契约和操作合同:- 打开服务契约文件(IService.cs),定义服务契约和操作合同。

- 示例代码如下:csharpIService.csusing CoreWCF;[ServiceContract]public interface IMyService{[OperationContract]string GetData(int value);更多操作合同...}5. 实现服务契约:- 创建一个新类,实现服务契约中定义的操作合同。

- 示例代码如下:csharpMyService.cspublic class MyService : IMyService{public string GetData(int value){return "You entered: {value}";}实现更多操作合同...}6. 配置WCF 服务:- 打开App.config 文件,配置WCF 服务绑定和终结点。

WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back)

WCF分布式开发步步为赢(10)请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back)

WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).所属分类: WCF分布式开发步步为赢, SOA and EAIWCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式。

今天本节文章里会详细介绍。

WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).本文结构:【1】请求应答(Request-Reply)、【2】单向操作(One-Way)、【3】回调操作(Call Back)、【4】示例代码分析、【5】总结。

最后上传本文的示例代码。

WCF除了支持经典的请求/应答模式意外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作(后者与WSE3.0提供的优化传输机制类似,我曾经在这个文章里进行过讲解WSE3.0构建Web 服务安全(4):MTOM消息传输优化和文件上传、下载)。

今天我们会介绍几种操作调用模式的概念,区别,实现机制,以及如何在代码中实现他们,最后给出的要注意的细节问题。

【1】请求应答(Request-Reply):请求应答模式是默认的操作模式。

这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果。

请求应答模式与绑定对应关系:1.绑定协议名称支持可靠性默认可靠性支持有序传递请求应答模式2.BasicHttpBinding No N/A No YesTcpBinding Yes Off Yes YesPeerTcpBinding No N/A No NoNamedPipeBinding No N/A (On) Yes Yes6.WSHttpBinding Yes Off Yes Yes7.WSFederationHttpBinding Yes Off Yes Yes8.WSDualHttpBinding Yes On Yes YesMsmqBinding No N/A No No10.MsmqIntegrationBinding No N/A No Yes除了NetPeerTcpBinding和NetMsmqBinding绑定,所有的绑定均支持请求-应答操作。

WCF简单实例

WCF简单实例

为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。

本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。

对那些对WCF不是很了解的读者来说,这个例子将带领你正式进入WCF的世界。

在这个例子中,我们将实现一个简单的计算服务(CalculatorService),提供基本的加、减、乘、除的运算。

和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器以致跨网络的服务调用。

在本例中,客户端和服务通过运行在相同的同一台机器上不同进程模拟,图1体现了客户端和服务端进程互相调用的关系。

图1 计算服务应用运行环境WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。

在我们的计算服务应用中,采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Hos ting.exe);通过IIS寄宿方式将服务寄宿于IIS中(寄宿进程为IIS的工作进行W3wp.exe)。

客户端通过另一个控制台应用模拟(进程为Client.exe)。

接下来,我们就一步一步来构建这样的一个WCF应用。

步骤一:构建整个解决方案通过VS 2008创建一个空白的解决方案,添加如下四个项目。

项目的类型、承载的功能和相互引用关系如下,整个项目在VS下的结构如图2所示。

Contracts:一个类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(W CF框架的绝大部分实现和API定义在该程序集中);∙Services:一个类库项目,提供对WCF服务的实现。

定义在该项目中的所有WCF服务实现了定义在Con tracts中相应的服务契约,所以Services具有对Contracts项目的引用;∙Hosting:一个控制台(Console)应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集;∙Client:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。

wcf使用流程

wcf使用流程

WCF使用流程WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的框架。

它提供了一种统一的编程模型,可以在不同的应用程序之间进行通信,并支持多种传输协议和消息格式。

本文将详细描述WCF的使用流程,包括创建服务和客户端、配置服务和客户端、部署和测试。

1. 创建服务首先,我们需要创建一个WCF服务。

下面是创建WCF服务的步骤:步骤1:创建一个新的WCF服务项目在Visual Studio中,选择”新建项目”,然后选择”WCF”类别下的”WCF服务应用程序”模板。

输入项目名称并点击”确定”。

步骤2:定义服务契约打开生成的IService.cs文件,在其中定义服务契约(Service Contract)。

契约是一个接口,它定义了可由客户端调用的操作。

[ServiceContract]public interface IService{[OperationContract]string GetData(int value);}步骤3:实现服务契约打开生成的Service.cs文件,在其中实现契约中定义的操作。

这些操作将在客户端调用时执行。

public class Service : IService{public string GetData(int value){return $"You entered: {value}";}}步骤4:配置服务终结点打开生成的App.config文件,在其中配置服务终结点。

终结点定义了服务的地址、协议和消息格式。

<system.serviceModel><services><service name="WcfService.Service"><endpoint address="" binding="basicHttpBinding" contract="WcfService.ISe rvice" /><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExch ange" /></service></services><behaviors><serviceBehaviors><behavior><serviceMetadata httpGetEnabled="true" /><serviceDebug includeExceptionDetailInFaults="false" /></behavior></serviceBehaviors></behaviors></system.serviceModel>2. 创建客户端接下来,我们需要创建一个WCF客户端,以便与服务进行通信。

WCF实例

WCF实例

学silverlight学到WCF,嗯,WCF的确有点难,不过没所谓,一点一点来,下面就尝试着实现一个最基本最简单的WCF例子,里面不涉及到EndPoint、Binding、Element、异步调用、序列化等等这些或者其他更难理解的概念,只是简单地按照默认设置用最简单的代码把WCF最基本的应用体现出来。

第一步:创建一个空的解决方案,新建一个WCF服务应用程序项目(使用默认名字)来模拟服务端,新建一个控制台应用程序项目(名称改为ConsoleApp)来模拟客户端。

第二步:简单分析WcfService1项目,该项目内容如下:一句话总结:这个项目模拟服务器端,Service1.svc文件封装的就是提供给客户端的服务引用,Service1.svc.cs文件里是服务引用的具体实现。

但这里因为Service1.svc.cs文件里的主要内容——Service1类是继承于IService1.cs文件里的IService1接口,所以重头戏分了一半给IService1.cs文件。

首先看IService1.cs文件,从名字上可以看得出这个是接口文件,里面定义了了一些接口,接口声明了一些方法。

我在里面添加两个类public class student1 、public class student2 和一个方法public student1 student1Class() 用作测试。

代码如下:View Code1using System;2using System.Collections.Generic;3using System.Linq;4using System.Runtime.Serialization;5using System.ServiceModel;6using System.ServiceModel.Web;7using System.Text;89namespace WcfService110 {11// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ISer vice1”。

WCF4.0进阶实现异步操作

WCF4.0进阶实现异步操作

WCF4.0进阶实现异步操作WCF 4.0 进阶实现异步操作单向操作特别适用于"触发然后忘记"场景,在该场景中,客户端程序并不期望服务回传任何信息。

但是,许多操作并不适用于这种情况,其向客户端程序返回数据。

为了处理这些情况,WCF支持异步操作和IAsyncResult设计模式。

在WCF中你可以使用两种方式实现IAsyncResult设计模式:在客户端程序中异步调用操作;或在WCF服务中实现异步操作。

IAsyncResult 设计模式并不是为WCF特别设计的,它在.NET Framework中被广泛使用。

更多详细信息,可以查阅MSDN的"异步编程设计模式"/en-us/library/ms228969.aspx在客户端程序中异步调用操作使用WCF,你可以生成一个特定版本的代理类,使用该代理类客户端程序可以异步地调用服务的操作。

在使用svcutil命令行工具时指定"/aysnc"标记可以生成特定版本的代理类。

你也可以在添加服务引用向导时,点击高级按钮,然后在服务引用设置对话框中选择生成异步操作复选框以生成该特定版本的代理类。

一个异步代理类为每个操作提供一对begin和end方法。

客户端程序可以调用begin方法以实例化该操作。

Begin方法在发送完请求后立即返回,但是.NET Framework运行时会在客户端创建一个新的线程用以等待请求的响应。

当你调用begin方法,你需提供回调方法的名字。

当服务完成操作并返回结果只客户端代理后,新线程中的回调方法开始执行。

你使用回调方法获取服务的返回结果。

你应该调用操作的end方法以表明你已处理完服务的响应。

理解随后这点非常重要:若要服务支持上述异步编程,你并不需要采用任何方式修改该服务。

实际上,服务自身都不必为一个WCF服务;它可能是通过其他技术实现的服务。

使操作对客户端程序为异步操作的代码封装在客户端的代理对象和.NET Framework运行时中。

关于WCF缓存机制介绍

关于WCF缓存机制介绍

关于WCF缓存机制介绍这里就WCF缓存做出了详细的案例分析,实现BehaviorExtensionElement,IEndpointBehavior将刚刚建立的行为加入Client行为集合,文章有详细的代码。

缓存是很占内存的,缓存也有它的好处,这里就WCF缓存机制分析一个案例,希望大家可以从中得到收获。

首先我们看看MSDN中对WCF的Session的说明:它们由调用应用程序显式启动和终止。

会话期间传递的消息按照接收消息的顺序进行处理。

会话将一组消息相互关联,从而形成对话。

该关联的含义是抽象的。

o为你解决WCF端口问题o经典讲解WCF数据契约o深入讲解WCF集合类型o新手必看WCF集合契约等价案例分析o手把手教你实现WCF上传文件例如,一个基于会话的通道可能会根据共享网络连接来关联消息,而另一个基于会话的通道可能会根据消息正文中的共享标记来关联消息。

可以从会话派生的功能取决于关联的性质。

不存在与 WCF 会话相关联的常规数据存储区。

最后一句告诉我们,WCF中的Session是无法像Web应用一样存储附加信息的。

经过研究,我们可以通过扩展MessageHeader实现一个附加的数据存储区在Client端每次请求Service时发送到Server端。

具体实现如下(以前述需求为例)。

这是一个单件类,Client正常登陆得到Server端回传的UserIdentity实例后可以通过如下代码将其存入WCF缓存:erPermissionInfo.GetInstance().SetUserIdentity(ServerReturnedUserIdentity);其中ServerReturnedUserIdentity就是Server产生并回传的UserIdentity下面我们扩展MessageHeader将我们自己定义的UserIdentity加入进去,WCF缓存代码如下:ingSystem;ingSystem.Collections.Generic;ingSystem.Text;ingSystem.ServiceModel;ingSystem.ServiceProcess;ingSystem.ServiceModel.Dispatcher;ingSystem.ServiceModel.Description;ingSystem.ServiceModel.Channels;ingSystem.ServiceModel.Configuration;spaceBNCommon.ClientHelper17.{18.publicclassBNClientMessageInspector:IClientMessageInspector19.{20.IClientMessageInspector成员#regionIClientMessageInspector成员21.publicvoidAfterReceiveReply(refMessagereply,objectcorrelationState)22.{23.}24.publicobjectBeforeSendRequest(refMessagerequest,IClientChannelchannel)25.{26.MessageHeader MessageHeadermh=MessageHeader.CreateHeader("UserIdentity","UINS",erPermissionInfo.GetInstance()._UserId entity);27.request.Headers.Add(mh);28.returnnull;29.}30.#endregion31.}32.}这个类实现了IClientMessageInspector接口,实现该接口可以在Client每次向Server 请求前及请求返回后控制Client的行为对发送和接收的数据进行处理。

WCF实例 —— Windows Service Host 开发,调试,制作安装包

WCF实例 —— Windows Service Host 开发,调试,制作安装包

WCF实例——Windows Service Host 开发,调试,制作安装包本篇实例介绍如何使用Windows Service来寄宿WCF服务:1. 添加WCF Service Library 工程,这一步没什么好说的。

为了简单测试,只保留下面一个服务方法:[csharp]view plaincopy1.public class Service1 : IService12.{3.public string GetData(int value)4. {5.return string.Format("You entered: {0}", value);6. }7.}2. 添加一个Windows Service 工程,实现Service1[html]view plaincopy1.public partial class Service1 : ServiceBase2.{3. public Service1()4. {5. InitializeComponent();6. }7.8. private ServiceHost _host;9.10. protected override void OnStart(string[] args)11. {12._host = new ServiceHost(typeof(WinSvcHostWcfLib.Service1));13. _host.Open();14. }15.16. protected override void OnStop()17. {18. if (_host != null)19. {20. _host.Close();21. (_host as IDisposable).Dispose();22. }23. }24.}注意:ServiceHost 里的typeof 里是Wcf 的Service,因为都叫"Service1" 所以注意用namespace 区分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)如此,本实例已全部完成了。

相关文档
最新文档