分布式系统:指在系统与系统之间进行通信,系统不再是孤立的,例如:淘宝查看物流信息,或是hao123的天气预报,这些可能都是用的别的系统的web方法。
1.创建空的解决方案
2.新建项目-WCF服务库项目,项目名称:XfrogWCFService
3.在XfrogWCFService项目中添加[System.ServiceModel]的引用
4.上图是该项目的结构打开IFirstServices.cs这个是接口也是一个服务契约,客户端调用方法都必须遵守,代码如下。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace XfrogWCFService { /// <summary> /// 注意在接口上申明了ServiceContract特性,即服务契约,表明该接口是一个服务 /// </summary> [ServiceContract] public interface IFirstService { /// <summary> /// 表示该方法是IFirstService的一个服务方法,客户端可远程调用该方法。 /// </summary> /// <param name="name"></param> /// <returns></returns> [OperationContract] String GetData(int a,int b); } }
5.再打开FiretService.cs这个文件对接口进行实现,也就是Web方法所要实现的功能,为了学习,做了一个两数相加的操作,代码如下。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace XfrogWCFService { public class FirstService : IFirstService { string IFirstService.GetData(int a,int b) { return String.Format("{0}+{1}={2}",a,b,(a+b)); } } }
6.下面我们在解决方案中重新建立一个【客户端控制台应用程序】的项目,名称叫做Host,这是web服务的主人[宿主],意思是该服务的启动或者关闭都归它来控制。
7.我们的解决方案成了上面的结构,也同样要添加[System.ServiceModel]的引用,还有对XfrogWCFService的引用,然后打开Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using XfrogWCFService; namespace Host { class Program { static void Main(string[] args) { //这段代码说创建一个新的服务宿主,这个服务是FirstService //也就是实现IFirstService接口的类 using (ServiceHost host = new ServiceHost(typeof(FirstService))) { host.Open(); Console.WriteLine("服务已启动,按任意键中止..."); Console.ReadKey(true); host.Close(); } } } }
8.接下来打开Host项目中的App.config文件,应该是会添加ServiceModel节点,如下面:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="XfrogWCFService.FirstService" behaviorConfiguration="behaviorConfiguration"> <host> <baseAddresses> <add baseAddress="http://192.168.10.58:8100/"/> </baseAddresses> </host> <endpoint address="http://192.168.10.58:8100/" binding="basicHttpBinding" contract="XfrogWCFService.IFirstService" name="BasicHttpBinding_IFirstService"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="behaviorConfiguration"> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
9.现在服务这边应该就是搭建好了,可以测试下,运行Host项目:如果是这样代表服务已经搭建成功了!
------------------------------------下面是客户端的哦-----------------------------------------
1.重新在别的地方建立一个解决方案,然后创建一个类库名称是Clinent1。
2.添加webService引用,步骤是:
2.1右击【引用】点击【添加服务引用】然后如下图:
地址是我们在wcf服务器端App.config页面写的地址将ip换成localhost
点击转到会查看到这个地址的服务
命名空间可以修改,这个是我们调用服务的命名空间,然后点击【确定】
3.给Clinent1添加ServiceModel引用。
4.在Clinent1中新建一个类Program.cs代码如下。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Clinent1 { public class Program { /// <summary> /// WCF调用方法 /// </summary> /// <param name="par"></param> /// <returns></returns> public string getwcfstr(int a,int b) { ServiceReference1.FirstServiceClient aa = new ServiceReference1.FirstServiceClient(); return aa.GetData(a, b);//调用服务服务器接口的方法。 } } }
5.在该解决方案中创建一个新的网站项目,添加ServiceModel和Clinent1的引用。
6.Clinent1的App.config如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IFirstService" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://192.168.10.58:8100/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFirstService" contract="ServiceReference1.IFirstService" name="BasicHttpBinding_IFirstService" /> </client> </system.serviceModel> </configuration>
7.web.Config在configuration下添加,代码如下:
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IFirstService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://192.168.10.58:8100/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFirstService" contract="ServiceReference1.IFirstService" name="BasicHttpBinding_IFirstService" /> </client> </system.serviceModel>
8.添加一个aspx页面,前台写个div后台代码如下:
protected void Page_Load(object sender, EventArgs e) { Program p=new Program();
//设置div的内容调用服务传递参数 div_wcf.InnerText = p.getwcfstr(10, 5); }
9.客户端的结构是:
10.运行WebForm1.aspx的效果:为了测试,做的功能很简单啊。