WCF实例
- 格式:pdf
- 大小:517.06 KB
- 文档页数:11
网上用来写三层结构和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 RIA Services访问数据库的实例,附带有数据库文件,可以在Sql Server中附加数据库,在本文中并没有采用实体数据模型绑定数据库,而是单独写一个类来连接数据库查询数据表并返回值,下面我们看详细步骤。
第一步:首先我们打开VS2010,新建一个Silverlight应用程序项目SLGetDataFromWCFRIA。
第二步:点击确定之后,在弹出的“新建Silverlight应用程序”窗口中,选中“启用WCF RIA 服务”复选框然后确定。
第三步:在创建好的项目中,鼠标右键点击“SLGetDataFromWCFRIA.Web”项目,然后“添加”-->“新建项”-->“WCF 服务”,命名为SLWCFRIA.svc。
第四步:在上一步生成的ISLWCFRIA.cs文件中,我们可以定义相关的通信的契约,在本实例中我们定义一个string GetData()契约。
第五步:在SLWCFRIA.svc.cs文件中我们实现这个契约函数,代码如下:using System;using System.Collections.Generic;using System.Linq;usingSystem.Runtime.Serialization;using System.ServiceModel;using System.Text;usingSystem.Data;using System.Data.SqlClient;namespace SLGetDataFromWCFRIA.Web{// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“SLWCFRIA”。
public class SLWCFRIA : ISLWCFRIA{public void DoWork(){}public string GetData(){DataSet ds= DB.Getdata("select * from userinfo");return ds.GetXml();}}}第七步:我们在SQL SERVER2008中创建一个示例数据库名为SLRiaTest。
使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用。
下面我们来看一下如何在IIS中部发布一个WCF服务。
环境是VS 2008 (公司电脑没有安装VS2010)^_^我们从头开始,不写代码,完全的配置,会收获不小。
新建一个WCF 服务库建立一个WCF服务应用程序结果如下删除掉WCF程序中不需要的默认文件,如下图为WcfService1项目添加WcfServiceLibrary1的引用,如下图。
修改声明指示内容,让这个Service.svc文件的后台代码指向我们创建的WCF服务库项目--WcfServiceLibrary1项目中的服务类,改后的代码如下:<%@ ServiceHost Language="C#" Debug="true"Service="WcfServiceLibrary1.Service1" %>Ctrl+Shift+B 编译一下解决方案,配置工具用的反射,先编译才行此时我们的WCF服务站点并不能把WCF服务库中的服务和终结点发布出来,还需要我们对web.config进行一系列的配置工作。
右键我们要配置的Web.Config文件,编辑WCF配置在弹出的服务配置窗口中,把Service1服务指定到WCF服务库的WcfServiceLibrary1.dll 中的WcfServiceLibrary1.Service1服务类上。
再把其中的一个对外终结点的Contract设为WCF服务库的WcfServiceLibrary1.dll中的WcfServiceLibrary1.IService1服务契约上。
这一步是可选的,我们再为此WCF服务站点添加一个终结点,配置如下图下面我们将试着使用不同的终结点与WCF服务进行交互,查看运行情况。
当我们使用IIS5或IIS6发布WCF服务的时候一般只创建Http绑定的终结点,而不能创建使用TCP绑定、管道绑定的终结点。
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使⽤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:由协议、地址和端⼝三个部分组成。
[原创]我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)对于.NET重载(Overloading)——定义不同参数列表的同名方法(顺便提一下,我们但可以在参数列表上重载方法,我们甚至可以在返回类型层面来重载我们需要的方法——页就是说,我们可以定义两个具有相同参数列表但不同返回值类型的两个同名的方法。
不过这种广义的Overloading不被我们主流的.NET 语言所支持的——C#, , 但是对于IL来说,这这种基于返回值类型的Overloading是支持的)。
相信大家听得耳朵都要起老茧了。
我想大家也清楚在编写传统的XML Web Service的时候,Overloading是不被支持的。
原因很简单,当我们用某种支持.NET的高级语言写成的程序被相应的编译器编译成Assembly 的过程中,不单单是我们的Source Code会被变成IL Code,在Assembly中还会生成相应的原数据Metadata——这些Metadata 可以被看看是一张张的Table。
这些Table存储了定义了主要3个方面的信息——构成这个Assembly文件的信息;在Assembly中定义的Type 及其相关成员的信息;本引用的Assembly 及Type的信息。
这些完备的Metadata成就了Assembly的自描述性(Self-Describing),也只是有了这些Metadata,使.NET可以很容易地根据方法参数的列表甚至是返回值得类型来判断调用的究竟了那个方法。
而对于XML Web Service,它的标准实际上是基于XML的,近一步说,一个XML Web Service 是通过一个一段XML来描述的,而这个描述XML Web Service的XML,我们称之为WSDL (Web Service Description Language)。
三层框架加WCF的实现实现三层框架加WCF的原因是三层框架直接暴露了数据库的连接给客户端,程序如果是广域网部署必然需要把数据库暴露在广域网,容易招致攻击,在三层架构中加入WCF就能通过WCF连接数据库从而避免上述问题。
不管UI采用的是那种方式这种方法都适用,本例的目的是演示完整的三层框架加WCF的实现。
整体的架构如下:关键代码:LovIServicenamespace LovWcfServiceLibrary{[ServiceContract]public interface LovIService{///<summary>///获取最大值///</summary>///<param name="FieldName">字段</param>///<param name="TableName">表名</param>///<returns></returns>[OperationContract]int GetMaxID(string str);///<summary>///记录是否存在///</summary>///<param name="strSql">SQL</param>///<param name="cmdParms">参数</param>///<returns></returns>[OperationContract]bool Exists(string str);///<summary>///执行一条计算查询结果语句,返回查询结果(object)///</summary>///<param name="SQLString">SQLString</param>///<returns></returns>[OperationContract]object GetSingle(string StrSql);[OperationContract]object GetSingleTimeOut(string StrSql);[OperationContract]object GetSingleAdd(string str);///<summary>///执行SQL语句,返回影响的记录数///</summary>///<param name="SQLString">SQL语句</param>///<param name="cmdParms">影响的记录数</param>///<returns></returns>[OperationContract]int ExecuteSql(string str);///<summary>///执行查询语句,返回DataSet///</summary>///<param name="SQLString">查询语句</param>///<returns>DataSet</returns>[OperationContract]DataSet Query(string str);///<summary>///执行查询语句,返回DataSet///</summary>///<param name="SQLString">查询语句</param>///<returns>DataSet</returns>[OperationContract]DataSet QueryDataSet(string StrSql);///<summary>///执行SQL语句,返回影响的记录数///</summary>///<param name="SQLString">SQL语句</param>///<returns>影响的记录数</returns>[OperationContract]int ExecuteSqlString(string StrSql);///<summary>///获取一个Datatable///</summary>///<param name="SQLString"></param>///<returns></returns>[OperationContract]DataTable QueryDataTable(string StrSql);///<summary>///执行更新、删除操作,返回影响行数///</summary>///<param name="sql">sql</param>///<returns>返回影响行数</returns>[OperationContract]int UpdateInsert(string StrSql);[OperationContract]bool SaveDataTable(string StrSql);[OperationContract]CompositeType GetDataUsingDataContract(CompositeType composite);}namespace LovWcfServiceLibrary{[KnownType(typeof(LovWcfServiceLibrary.LovService))]public class LovService:LovIService{///<summary>///最大值///</summary>///<param name="FieldName">字段</param>///<param name="TableName">表名</param>///<returns></returns>public int GetMaxID(string str){SystemStringCode.SendClass cmd=newSystemStringCode.ClassSerializers().DeSerializeBinary(newSystem.IO.MemoryStream(Convert.FromBase64String(str)))as SystemStringCode.SendClass;return DBUtility.DbHelperSQL.GetMaxID(cmd.FieldName,cmd.TableName);}///<summary>///是否存在该记录///</summary>///<param name="strSql">SQL</param>///<param name="cmdParms">参数</param>///<returns></returns>public bool Exists(string str){SystemStringCode.SendClass cmd=newSystemStringCode.ClassSerializers().DeSerializeBinary(newSystem.IO.MemoryStream(Convert.FromBase64String(str)))as SystemStringCode.SendClass;return DBUtility.DbHelperSQL.Exists(cmd.StrSql,cmd.ilist);}///<summary>///执行一条计算查询结果语句,返回查询结果(object)///</summary>///<param name="SQLString"></param>///<returns></returns>public object GetSingle(string StrSql){return DBUtility.DbHelperSQL.GetSingle(StrSql);}public object GetSingleTimeOut(string StrSql){SystemStringCode.SendClass cmd=newSystemStringCode.ClassSerializers().DeSerializeBinary(newSystem.IO.MemoryStream(Convert.FromBase64String(StrSql)))as SystemStringCode.SendClass;return DBUtility.DbHelperSQL.GetSingle(cmd.StrSql,cmd.Times);}DAL代码示例///<summary>///获得前几行数据///</summary>public DataSet GetList(int Top,string strWhere,string filedOrder){StringBuilder strSql=new StringBuilder();strSql.Append("select");if(Top>0){strSql.Append("top"+Top.ToString());}strSql.Append("IDX,TableName,CName,CreateDate,refdate,Operation,Remark");strSql.Append("FROM MF_dictionary");if(strWhere.Trim()!=""){strSql.Append("where"+strWhere);}strSql.Append("order by"+filedOrder);//return DbHelperSQL.Query(strSql.ToString());LovServiceReference.LovIServiceClient sc=newLovServiceReference.LovIServiceClient();try{sc.Open();return sc.QueryDataSet(strSql.ToString());}catch{return null;}finally{sc.Close();}}。
本人开发c/s模式的软件,使用clickonce发布,数据库的连接字符都写在代码中,这时候一旦被反汇编,数据安全无法保障,因此考虑使用wcf服务,用于传输数据库连接字符,避免将连接字符写入代码中被反汇编。
(当然,也可以直接用于传输数据,更加安全)。
一、新建项目,选择Wcf服务库,取名A(为便于理解,不修改默认文件)二、菜单->文件->添加,新建项目,选择windows窗体应用程序,取名B三、打开B项目中的form1,添加一个按钮button1,命名为”启动服务”四、右键点击B项目,设置为启动项目五、B项目,(菜单)项目->添加引用,选择A项目,确定。
六、继续添加引用system.servicemodel七、复制以下代码到B项目的form1Imports System.ServiceModelImports System.ServiceModel.DescriptionPublic Class Form1Dim Host1 As ServiceHostPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickHost1 = New ServiceHost(GetType(A.Service1), New Uri("net.tcp://localhost:1000/")) '用于监听的地址,在服务器就是localhost,不要改。
Host1.Description.Behaviors.Add(NewServiceMetadataBehavior())Host1.AddServiceEndpoint(GetType(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "A") '这个不明白啥意思,不做就不能用。
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实例(带步骤)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 = new ServiceHost(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 = newWinFormsClient.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()得到剩余车票信息运行结果如下:点击购买车票:点击查询票数时:。