引言
最近在项目中见到了师哥们经常谈到的WCF这方面的知识,当时在敲代码的时候也没有理解wcf到底是个什么东西?
以及我们为什么在项目中会采用这样的框架来实现,只是按照师哥他们写好的代码编写相同格式的代码,随着代码敲的越来越多就慢慢的懂得了怎样实现客户端和服务端的连同,但是wcf真正的运行机制还是一点也不懂,最近在听师
哥们讲课的时候有讲解了一些关于WCF的知识,自己感觉应该好好理解这方面的知识了,并且这个东西在项目中是非常常见的,下面就结合我实现的一个小Demo来和大家分享一下。
其中一些最基本的概念,大家可以参考百度百科关于wcf的介绍,在这里给大家两张图对比一下,能很好的体现出wcf的用途:
基于ASP.net的应用程序与面向服务开发
在基于Asp.net 的应用程序开发中,我们由客户机的浏览器访问应用程序服务器,然后通过应用程序服务器中的数据库连接去连接数据库服务器,读取或是操作数据,有时候可能会多一个文件服务器。大家可以观察到,基本上所有的应用都放在了一台服务器上,但对于一个,由于业务上的需要(如:与外部系统交互),一台服务器很难支持所有的应用。下面来看这样一张图
客户机使用浏览器访问服务器A,服务器A为了业务需要与其他各种应用部署在服务器B、C、D....再通过WCF技术互相通信,相互访问...然而面向服务的好处不仅仅在此,他还提供了不同语言不同操作系统的可交互性..下面我们就开始创建一个客户端和服务端分离的wcf应用程序:
1、创建我们的wcf的服务端——在新建项目的时候选择WCF服务应用程序
2、从图中我们可以看出,在我们建立好的解决方案中有默认的两个service.svc和Iservice.cs文件,我们可以将这两 个文件删除,然后添加我们自己的wcf服务,步骤如图:
3、在解决方案里面我们可以看见,当我们添加了一个User.svc后,vs会自动生成WCF借口IUser.cs,这是我们需要在IUser.cs定义WCF方法ShowName,在User.svc.cs对该接口的方法进行实现。代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace DemoServiceWCF { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IUser”。 [ServiceContract] public interface IUser { [OperationContract] string ShowName(string name); } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace DemoServiceWCF { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“User”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 User .svc 或 User .svc.cs,然后开始调试。 public class User : IUser { public string ShowName(string name) { string wcfName = string.Format("WCF服务,显示姓名:{0}", name); return wcfName; } } }
大家在wcf接口中看到与平时我们不同的就是它多了两个标签,其余的和我们正常的学习的接口是一样的,添加这两 个标签是依赖System.ServiceModel的引用。
[ServiceContract],来说明接口是一个WCF的接口,如果不加的话,将不能被外部调用。
[OperationContract],来说明该方法是一个WCF接口的方法,不加的话同上。
其实简单来说这两个标签就是区分普通接口和普通方法的一个标示,就像我们提高班的第十期和第十一期还有十二期一样,例如现在十期有一个叫张三的同学,十一期也有一个叫张三的同学,这样我们找人的时候必须得有这个不同的期号来区分。
4、下面来看一下运行的效果,将User.svc设为起始页后运行。
这样我们的wcf服务端基本上就可以用了,剩下的就是将这个服务端发布然后部署到IIS上,就可以供客户端使用了,在这我就不给大家详解怎样在IIS上发布wcf,我们就使用一个简单的办法就是直接预览user.svc,如图:
其实WCF的应用场景可以大概可以这样简单的描述一下:我们设计的场景是在生产中经常应用的场景,把WCF程序寄宿在IIS之上。假设场景如下:A服务器和B服务器。我们把我们刚刚建立的WCF程序“部署”在B服务器上(本教程的A,B服务器都放是我自己的一台机器),我们的目标是在A服务器的应用程序来访问B服务器的WCF程序,实现服务器端的应用程序通讯。
下面来看我们客户端的创建
1、首先我在客户端创建了一个web应用程序;
2、下面我们需要添加一个服务引用如图,填写好地址后点击转到按钮,然后点击确定
引用完成后,我们在解决方案中会发现多出一个文件:
3、页面中的代码如下
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="User.aspx.cs" Inherits="DemoClientWCF.User" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <asp:TextBox ID="txtName" runat="server"></asp:TextBox><br /> <asp:Button ID="btnSubmit" runat="server" Text="测试WCF服务" OnClick="btnClick" /> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using DemoClientWCF.ServiceReference; namespace DemoClientWCF { public partial class User : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnClick(object sender, EventArgs e) { UserClient user = new UserClient(); string result = user.ShowName(this.txtName.Text); Response.Write(result); } } }
4、下面给大家解释几个比较重要的代码
1、using DemoClientWCF.ServiceReference;这个引用中 DemoClientWCF为我们客户端的命名空间,ServiceReference为我们在添加服务引用的时候,需要我们记住的那个名称。
2 UserClient user = new UserClient();UserClient就是我们在添加引用的时候生成的服务端User类的客户端代理类,一般客户端的代理类名称都会是***Client。其中User就是我们服务端添加的那个wcf服务(user.svc)的名称。
到这我们就完成了一个很简单的WCF的小Demo,同时完成了由A服务器的应用小B服务器中WCF提供的方法的调用。
小结
这个小Demo算是我们学习WCF的最基础的入门,在我看来对于刚入门的读者们来说应该是很容易接受的,也算是完成了一个基础的教程,随着对wcf的更深入的学习,我会继续更新此类博客来和大家交流,如果此博客有什么不懂的地方可以留言交流。