WCF实例
C#WCF服务

C#WCF服务1:什么是WCF。
WCF(Windows Communication Foundation)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。
整合了原有的windows通讯的.net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
是Windows平台上开发分布式应用最佳的实践方式。
WCF是.Net框架中的技术,用来创建面向服务的应用程序,交换不同通信方案里的消息,以及执行服务操作生成的工作流。
WCF应用程序由三部分组成 - WCF服务,WCF服务主机和WCF服务客户端。
WCF平台有时也被称为服务模型。
WCF的基本特征是互操作性。
这是微软用于构建面向服务的应用程序的最新技术之一。
根据基于消息的通信的概念中,一个HTTP请求可以被均匀地表示,WCF是一个统一的API而不管不同的传输机制。
是以契约(Contract) 来定义双方沟通的协议,契约必须要以接口的方式来体现,而实际的服务代码必须要由这些契约接口派生并实现。
契约分成了四种:1.数据契约(Data Contract),订定双方沟通时的数据格式。
2.服务契约(Service Contract),订定服务的定义。
3.操作契约(Operation Contract),订定服务提供的方法。
4.消息契约(Message Contract),订定在通信期间改写消息内容的规范。
WCF 实现上已经支持了传输层次安全性(Transport-level security) 以及消息层次安全性 (Message-level security) 两种。
传输层次安全性:在数据传输时期加密,例如 SSL。
消息层次安全性:在数据处理时就加密,例如使用数字签名,散列或是使用**加密法等。
2:WCF能做什么WCF 整合ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术,主要用于在分布式系统中提高网络和服务的支持,寄宿的宿主可以是命令行控制台、IIS、桌面程序等。
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]标签。
WebService Wcf 契约的解释

化零为整WCF(2) - 契约Contract(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)作者:webabcd介绍WCF(Windows Communication Foundation) - 契约(Contract):服务契约(ServiceContract),操作契约(OperationContract),数据契约(DataContract),服务已知类型(ServiceKnownType),数据成员(DataMember)。
示例1、服务IPersonManager.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.Runtime.Serialization;namespace WCF.ServiceLib.Contract{///<summary>///人员管理接口///</summary>// Namespace - 服务契约的命名空间// Name - 服务契约的名称(会对应到相关的wsdl,默认情况下本例为接口名“IPersonManager”)// ConfigurationName - 服务契约在宿主中所配置的服务名称(默认情况下本例为类的全名“WCF.ServiceLib.Contract.IPersonManager”)[ServiceContract(Namespace = "", N ame = "IPersonManager", ConfigurationName = "ConfigurationNameTes t")]// 服务已知类型 - Student(数据契约)继承自Person(数据契约),要指定Student为已知类型,其才会被序列化[ServiceKnownType(typeof(Student))]public interface IPersonManager{///<summary>///获取某人的姓名///</summary>///<param name="p">Person对象</param>///<returns></returns>// Name - 操作契约的名称(会对应到相关的wsdl,默认情况下本例为方法名“GetName”)[OperationContract(Name="GetPersonName")]string GetName([MessageParameter(Name = "person")] Perso n p);}}PersonManager.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.Runtime.Serialization;namespace WCF.ServiceLib.Contract{///<summary>///人员管理类///</summary>public class PersonManager : IPersonManager{///<summary>///获取某人的姓名///</summary>///<param name="p">Person对象</param>///<returns></returns>public string GetName(Person p){return "Name: " + ;}}}Person.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.Runtime.Serialization;namespace WCF.ServiceLib.Contract{///<summary>/// Person的实体类///</summary>// Name - 数据契约的名称(会对应到相关的wsdl,默认情况下本例为类名“Person”) [DataContract(Name = "PersonModel")]public class Person{///<summary>/// Person的实体类的Age属性///</summary>// Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“Age”) // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在// Order - 数据成员在相关的wsdl中的顺序// EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true[DataMember(Name = "PersonAge", IsRequired = false, Order = 1)]public int Age { get; set; }///<summary>/// Person的实体类的Name属性///</summary>// Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“Name”) // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在// Order - 数据成员在相关的wsdl中的顺序// EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true[DataMember(Name = "PersonName", IsRequired = false, Order = 0)] public string Name { get; set; }}}Student.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.Runtime.Serialization;namespace WCF.ServiceLib.Contract{///<summary>/// Student的实体类///</summary>// Name - 数据契约的名称(会对应到相关的wsdl,默认情况下本例为类名“Student”) [DataContract(Name = "StudentModel")]public class Student : Person{///<summary>/// Student的实体类的School属性///</summary>// Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“School”) // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在// Order - 数据成员在相关的wsdl中的顺序// EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true[DataMember(Name = "School", IsRequired = false, Order = 0)]public string School { get; set; }}}2、宿主PersonManager.svc<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLi b.Contract.PersonManager" %>Web.config<?xml version="1.0"?><configuration><system.serviceModel><behaviors><serviceBehaviors><behavior name="ContractBehavior"><!--httpGetEnabled - 使用get方式提供服务--><serviceMetadata httpGetEnabled="true"/></behavior></serviceBehaviors></behaviors><services><!--name - 提供服务的类名--><!--behaviorConfiguration - 指定相关的行为配置--><service name="WCF.ServiceLib.Contract.PersonManager" behaviorConfiguration ="ContractBehavior"><!--address - 服务地址--><!--binding - 通信方式--><!--contract - 服务契约--><endpoint address="" binding="basicHttpBinding" contract="ConfigurationNameTe st"/></service></services></system.serviceModel></configuration>3、客户端PersonManager.aspx<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" Co deFile="PersonManager.aspx.cs"Inherits="Contract_PersonManager" Title="契约(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)" %><asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"></asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Serv er"><asp:TextBox ID="txtName" runat="server" Text="webabcd"/> <asp:Button ID="btnGetName" runat="server" Text="GetName"onclick="btnGetName_Click"/></asp:Content>PersonManager.aspx.csusing System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;public partial class Contract_PersonManager : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}protected void btnGetName_Click(object sender, EventArgs e){// Contract.IPersonManager pm = new Contract.PersonManagerClient();Contract.PersonManagerClient proxy = new Contract.PersonManagerClient();Contract.StudentModel sm = new Contract.StudentModel() { PersonName = txtNa me.Text };Page.ClientScript.RegisterStartupScript(this.GetType(),"js",string.Format("alert('{0}')", proxy.GetPersonName(sm)),true);proxy.Close();}}Web.config<?xml version="1.0"?><configuration><system.serviceModel><client><!--address - 服务地址--><!--binding - 通信方式--><!--contract - 服务契约--><endpoint address="http://localhost:3502/ServiceHost/Contract/PersonManager.svc " binding="basicHttpBinding" contract="Contract.IPersonManager"/></client></system.serviceModel></configuration>运行结果:单击"btnGetName"后弹出提示框,显示"Name: webabcd"。
基于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的学生管理系统的设计与实现

p r e s s , 2 00 7 .
[ 2 ] S c o t t KI e i n P r o f e s s i o n a l WCF P r o g r a mmi n g , US : Wr o x
pr e s s , 2 0 07 .
[ 3 】 吴晟 基于WC F 技术s o a J l i 务 平 台设计与实现 . 吉林: 吉 林 大 学, 2 0 0 9 [ 4 】 任毅. 基 于S OA的 电子政 务平 台的配置 管理研 究
口 ) ] . 武 汉: 武汉 理 工 大 学, 2 0 1 0 .
…
…
…
…
…ቤተ መጻሕፍቲ ባይዱ
…
…
…
…
…
一
廑 一 l
E x c e l 的格 式 导 出数 据 。 3 . 统计分析模块 该 模块 主要 负 责对 学 生 信 息进 行 统 计 分析 ,对得到 的相关 结果进行 查询 。在 学生 基本信 息统计 界面 ,管理员可 以查看学 生的 所有信 息,在此 界面所 有学生 的信息非 常直 观 地 统 计 给 管 理 员 。在 学 生 住 宿 信 息 统 计 界 面 ,可 以对 住 宿 楼 、 单 元 等 信 息 进 行 统 计 。 在班级 人数统 计界面 ,管理员 可 以统计 各个 班 级 的 人 数 , 以 班 为 单 位 进 行 学 生 基 本 情 况 的统计分析 。 4 . 宿舍管理模块 该 模 块 主 要 负 责 对 学 生 的宿 舍 信 息进 行 管 理 。 在 学 生 住 宿 情 况 导 入 界 面 ,管 理 员 可 以将各 宿舍 区、各楼 区的情况 导入到数 据库 中 ,并 可 以非 常 方 便 地 查 询 、 统 计 学 生 宿 舍 情况 。在宿舍 统计模块 ,管理 员可 以统 计宿 舍 的 具 体 信 息 5 . 奖惩管理模块 用 户 进 入 此 模 块 后 ,可 以 查 询 学 生 的 奖 惩 信 息 、 修 改 学 生 的奖 学 金 、违 纪 情 况 等 相 关 内容 。 该 模 块 不 仅 包 含 了学 生 的 奖 惩 信 息 的 管 理 , 而 且 可 以 进 行 学 生 的 相 关 奖 惩 信 息 的 查 询 以及 添 加 、 更 新 和 删 除 等 操 作 。 在 奖 学 金 管 理 功 能 界 面 , 管 理 员 权 限 可 以查 看 所 有 院系 的学生 的获奖情 况 ,辅 导员权 限只能 查 看 自 己 院 系 的 学 生 的相 关 获 奖 情 况 。 辅 导 员 权 限 可 以在 违 纪 处 分 管 理 功 能 中 添 加 、 查
一个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:由协议、地址和端⼝三个部分组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WCF实例(带步骤)WCF实例(带步骤)、WCF| 2010-02-26 14:31:44 阅读31 评论0 字号:大中小以订票为例简单应用wcf新建一个wcf服务应用程序在IService1.cs定义服务契约namespace WcfDemo{// 注意: 如果更改此处的接口名称 "IService1",也必须更新Web.config 中对 "IService1" 的引用。
[ServiceContract] // 服务合同即提供服务的接口或类public interface IService1{[OperationContract]/* 增加车票的方法*/void AddTicket(int count);[OperationContract]/*购买车票的方法*/int BuyTickets(int Num);[OperationContract] //服务契约即提供服务的实现方法/*查询车票的方法*/int GetRemainingNum();// 任务: 在此处添加服务操作}// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract] //数据契约public class Ticket{bool boolCount = true;//判断是否还有车票int howmany = 10;//还有多少车票[DataMember]/*判断是否还有票*/public bool BoolCalue{get { return boolCount; }set {if (HowMany > 0){boolCount = false;}else{boolCount = true;}}}[DataMember]/*返回票数*/public int HowMany{get { return howmany; }set { howmany = value;}}}}在Service1.svc中实现契约服务namespace WcfDemo{// 注意: 如果更改此处的类名“Service1”,也必须更新 Web.config 和关联的 .svc 文件中对“Service1”的引用。
public class Service1 : IService1{Ticket T=new Ticket();/*实现添加票数的方法*/public void AddTicket(int count){T.HowMany=T.HowMany+count;}/*实现返回票数的方法*/public int GetRemainingNum(){return T.HowMany;}/*实现购买车票的方法*/public int BuyTickets(int Num){if (T.BoolCalue){T.HowMany = T.HowMany - Num;return1;}else{return0;}}}}添加宿主程序用于监测服务添加WinForm项目加入解决方案界面如下图:界面上两个按钮:启动服务按钮:用于启动wcf服务停止服务按钮:用于停止wcf服务Label: 用于显示服务相关信息后台代码为:应用命名空间 using System.ServiceModel;添加引用 wcf服务生成的dll文件public partial class Form1 : Form{public Form1(){InitializeComponent();}ServiceHost host = null;//定义 ServiceHostprivate void button1_Click(object sender, EventArgs e){host = newServiceHost(typeof(WcfDemo.Service1));//WcfDemo.Service1 为引用的dll中的服务host.Open();//启动服务bel1.Text = "服务已启动";}private void button2_Click(object sender, EventArgs e){if (host.State != CommunicationState.Closed)//判断服务是否关闭{host.Close();//关闭服务}bel1.Text = "服务已关闭";}}接下来配置app.config<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><services><!--添加服务--><service name="WcfDemo.Service1"behaviorConfiguration="CalculatorServiceBehavior"><!--name 必须与代码中的host实例初始化的服务一样behaviorConfiguration 行为配置 --><host><baseAddresses><!--添加调用服务地址--><add baseAddress="http://localhost:8000/"/></baseAddresses></host><!--添加契约接口 contract="WcfDemo.IService1" WcfDemo.IService1为契约接口 binding="wsHttpBinding" wsHttpBinding为通过Http调用--><endpoint address="" binding="wsHttpBinding" contract="WcfDemo.IService1"></endpoint></service></services><!--定义CalculatorServiceBehavior的行为--><behaviors><serviceBehaviors><behavior name="CalculatorServiceBehavior"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="false"/> </behavior></serviceBehaviors></behaviors></system.serviceModel></configuration>程序运行结果:在服务启动后可通过appConfig中baseAddress节点中的baseAddress地址查看Wcf服务到这服务以及服务主机都已经创建好了下面该创建测试客户机了!新建个WinForm程序做为我们的测试客户机界面两个按钮一个label购买车票:调用wcf服务的BuyTickets()方法查询车票:调用wcf服务的GetRemainingNum()方法label用于显示运行信息为项目添加服务引用地址输入服务主机appconfig中baseAddress地址点击前往(添加服务引用时一点是在服务启动状态下的)后台代码为:public partial class Form2 : Form{public Form2(){InitializeComponent();}ServiceReference1.Service1Client TClient = new WinFormsClient.ServiceReference1.Service1Client();//声明客户端调用private void button1_Click(object sender, EventArgs e) {int i = TClient.BuyTickets(2); //调用WCF中的方法if (i == 1){bel1.Text = "购买成功";}bel1.Text += "剩余车票还有" +TClient.GetRemainingNum().ToString();}private void button2_Click(object sender, EventArgs e){bel1.Text = "";bel1.Text = TClient.GetRemainingNum().ToString();//调用WCF中的方法}}点击购买车票时调用wcf的BuyTicket()方法并返回剩余车票的信息点击查看车票时调用wcf的GetRemainingNum()得到剩余车票信息运行结果如下:点击购买车票:点击查询票数时:。