[原创]WCF入门级使用教程(转载请注明出处)

开发环境:vs2008英文版(SP1) + IIS + Windows2003

整个解决方案有4个项目 01.WCF ---Class Libary项目,用于生成WCF所需的类/接口文件 02.BLL ---Class LIbary项目,演示用的业务逻辑层(仅做分层演示用,无实际意义) 03.WEB ---Web Application,WCF服务将发布在这个项目中(即本例是把WCF宿主在IIS里) 04.Client--Console Application,命令行程序,用于演示调用WCF的客户端程序

项目引用关系: 01.WCF ---独立项目,无引用 02.BLL ---引用WCF,即业务逻辑层,引用Wcf 03.web ---引用BLL,即Web UI层引用BLL 04.Client --独立项目,无引用

步骤: 1.打开vs2008,File-->new project-->Visual C#/Windows-->Class Libary,命名为01_WCF

2.WCF项目上右击,Add-->New Item-->WCF Service ,命名为CalculateService.cs,确认后,系统会同时生成一个ICalculateService.cs的接口文件

ICalculateService.cs的内容如下(本例中,仅写了二个示例方案,Add与Sub,用于实现数字的加减):

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7
 8 namespace WCF
 9 {
10    // NOTE: If you change the interface name "ICalculateService" here, you must also update the reference to "ICalculateService" in App.config.
11    [ServiceContract]
12    public interface ICalculateService
13    {
14        [OperationContract]
15        double Add(double x, double y);
16
17        [OperationContract]
18        double Sub(double x, double y);       
19    }
20 }

这里可以看出,除了类前面加了[ServiceContract],以及方法签名前加了[OperationContract],其它跟普通的接口文件完全一样。这部分也称为WCF的契约 再来看CalculateService.cs,即实现契约的部分 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7
 8 namespace WCF
 9 {
10    // NOTE: If you change the class name "CalculateService" here, you must also update the reference to "CalculateService" in App.config.
11    public class CalculateService : ICalculateService
12    {
13        public double Add(double x, double y) 
14        {
15            return x + y;
16        }
17
18        public double Sub(double x, double y)
19        {
20            return x - y;
21        }       
22    }
23 }

这个类实现了刚才的ICalculateService接口,其它与普通类文件完全一样

build一下,如果没错的话,wcf这个项目就算完工了

3.解决方案上右击,add-->new Project-->class Libary 命名为BLL,即业务逻辑层,然后在BLL项目的References上右击-->add References-->Projects-->选择01_WCF项目,完成对项目WCF的引用

4.把BLL中默认的Class1.cs删除,新建一个Test.Cs,内容如下: 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace BLL
 7 {
 8    public  class Test
 9    {
10        public string HelloWorld() 
11        {
12            return "Hello World!";
13        }
14
15        public double Add(double x, double y) 
16        {
17            return new WCF.CalculateService().Add(x, y);
18        }
19    }
20 }

这里仅做了一个示例,写了一个Add方法,用来调用WCF.CalculateService中的Add方法,到目前为止,可以看出,这跟普通项目的引用,以及普通类的引用没有任何区别,Build一下,如果没有问题的话,BLL项目也告一段落了

5.解决方案右击,add-->new project-->Asp.net Web Applicatin或Asp.net 3.5 Extenstions Web Application都可以,命名为03_WEB,同样添加对BLL项目的引用

6.在WEB项目中,新建一个WCF目录,然后在该目录下Add-->new Item-->WCF Service,命名为CalculateService.svc,添加后,这里有一个关键步骤,把WCF目录下,除CalculateService.svc以外的文件都删除,然后双击CalculateService.svc,修改内容为 <%@ ServiceHost Language="C#" Debug="true" Service="WCF.CalculateService" %> 因为实际上WCF的主要内容已经在WCF项目中实现了,所以这里只要标明Service="WCF.CalculateService"就可以了

,顺便给出web.config的一段关键配置 

 1
 2<system.serviceModel>
 3        <behaviors>
 4            <serviceBehaviors>
 5                <behavior name="WEB.DemoServiceBehavior">
 6                    <serviceMetadata httpGetEnabled="true"/>
 7                    <serviceDebug includeExceptionDetailInFaults="false"/>                    
 8                </behavior>
 9            </serviceBehaviors>
10        </behaviors>
11        <bindings>
12            <wsHttpBinding>
13                <binding name="WSHttpBinding_ICalculateService">
14                    <security mode="None">                        
15                    </security>
16                </binding>
17            </wsHttpBinding>
18        </bindings>
19        <services>
20            <service behaviorConfiguration="WEB.DemoServiceBehavior" name="WCF.CalculateService">
21                <endpoint address="wcf" binding="wsHttpBinding" contract="WCF.ICalculateService" bindingConfiguration="WSHttpBinding_ICalculateService" name="WCF.ICalculateService"/>        
22                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
23            </service>
24        </services>
25    </system.serviceModel>
26    

7.WCF在IIS里的配置 iis里新建一个站点,指向WEB项目所在的目录,端口在本例中设置为90,如果在浏览器直接浏览http://localhost:90/WCF/CalculateService.svc,表明IIS的环境没问题,如果不行,建议重新安装.net framework3.5(当然也有其它办法,就是增加svc后缀的映射,这个百度一下N多,就不重复了)

8.刚才的WEB项目里,应该还有一个Default.aspx的页面,这里我们简单示例一下调用BLL层代码(Default.aspx.cs内容)

 1 namespace WEB
 2 {
 3    public partial class _Default : System.Web.UI.Page
 4    {
 5        protected void Page_Load(object sender, EventArgs e)
 6        {
 7            //通过BLL层来调用WCF中的方法 
 8            BLL.Test _Test = new BLL.Test();
 9            double z= _Test.Add(5, 10);
10            Response.Write(z.ToString());           
11        }
12    }
13 }

编译浏览该页面,如果能显示15,表示ok了,Web项目完工

9.解决方案中,再添加一个Console Application,命名为04_Client,我们将在这个项目中,调用WEB中的WCF,注意要添加对System.ServiceModel的引用

10.关键步骤:浏览http://localhost:90/WCF/CalculateService.svc时,会发现页面上有一个提示:

若要测试此服务,需要创建一个客户端,并将其用于调用该服务。可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作: svcutil.exe http://jimmycntvs:90/WCF/CalculateService.svc?wsdl (注:这里的JimmyCntvs就是我的机器名)

复制这一行命令,然后打开windows的开始菜单-->Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 Command Prompt进到vs2008的命令行 输入刚才的命令,并加一个参数/d:c:\123\ 即输出文件保存在c:\123目录中

svcutil.exe http://jimmycntvs:90/WCF/CalculateService.svc?wsdl /d:c:\123\

完成后,查看c:\123目录,会生成二个文件CalculateService.cs,output.config 把CalculateService.cs加到Client项目中,同时在Client项目中,增加一个App.Config,然后把output.Config的内容复制到App.Config中

这一步的目的在于利用svcutil.exe这个工具,生成客户端调用所需的代理类和配置文件

11.客户端代码的编写

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace ConsoleTest
 7 {
 8    class Program
 9    {
10        static void Main(string[] args)
11        {
12            CalculateServiceClient _client = new CalculateServiceClient();
13            double x = 5, y = 10;
14            double z = _client.Add(x, y);
15
16            Console.WriteLine("{0} + {1} = {2}", x.ToString(), y.ToString(), z.ToString());
17
18            Console.ReadLine();
19        }
20    }
21 }
22

调用真的很简单吧,好了,总结一下: 本例中,先编写了一个简单的WCF服务,然后把它宿主在IIS中运行,然后用控制台程序来调用这个WCF.

当然WCF深入研究下去,远比这个复杂,这篇文章主要是为了消除大家对新技术的恐惧,快速上手WCF的使用,其实MS每次推出的新技术,听上去蛮吓人,用起来都很简单的.

(转载请注明来自"菩提树下的杨过")

点击此处下载源代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小讲堂

ASP.NET AJAX(15)__构建高性能ASP.NET AJAX应用UpdatePanel的性能问题使用UpdatePanel的注意事项脚本加载避免脚本阻塞页面显示AjaxControlTool

UpdatePanel的性能问题 在UpdatePanle使用的时候,它每次的更新都是将整个页面回送的,而且也会加上一些他更新的标记,所以往往它传递的数据量比传...

32810
来自专栏空间大数据可视化

利用iframe+from表单实现跨域上传文件

1354
来自专栏晓晨的专栏

asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法

1955
来自专栏圣杰的专栏

Abp通用配置模块的设计

下面我将尝试用最简单易懂的方式,对Abp源码中通用配置模块的实现方式加以提炼和精简,尽量继承原作者的设计思想,给大家呈现通用配置模块的“最佳实践”。

3441
来自专栏石奈子的Java之路

原 荐 Java9之HttpClientAP

2682
来自专栏dotnet & java

WCF 入门 (21)

其实不太了解为什么第21集才讲这个Binding,下面都是一些概念性的东西,不过作为一个入门视频,了解一下也无妨吧。

925
来自专栏抠抠空间

Django之admin的使用和源码剖析

1910
来自专栏听雨堂

【9】分页浏览的管理

阅读目录 分页关注的内容 状态的传递 数据的获取 查询结果的分页 跳页的实现 分页器的样式 页面的完整处理流程 分页关注的内容 前面博文中,通过自...

2247
来自专栏魏琼东

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

     在很多MIS项目之中都有这样的需求,需要一个及时、高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下...

4530
来自专栏LanceToBigData

HttpClient(二)HttpClient使用Ip代理与处理连接超时

前言   其实前面写的那一点点东西都是轻轻点水,其实HttpClient还有很多强大的功能:   (1)实现了所有 HTTP 的方法(GET,POST,PUT,...

4078

扫码关注云+社区

领取腾讯云代金券