无废话WCF入门教程六[一个简单的Demo]
来源:互联网 发布:手机淘宝历史版本5.1.1 编辑:程序博客网 时间:2024/05/16 11:52
一、前言
%26nbsp;%26nbsp;%26nbsp; 前面的几个章节介绍了很多理论基础,如:什么是WCF、WCF中的A、B、C。WCF的传输模式。本文从零开始和大家一起写一个小的WCF应用程序Demo。
%26nbsp;%26nbsp;%26nbsp; 大多框架的学习都是从增、删、改、查开始来学习的,我们学习WCF也是一样的。从简单来看(不包括安全、优化等相关问题),WCF的增删改查和WebForm相差无几。WCF只是把具体%26ldquo;实现%26rdquo;写在%26ldquo;Service端%26rdquo;,而%26ldquo;调用%26rdquo;放在了%26ldquo;Client端%26rdquo;。觉得有帮助别忘了点个赞哈,谢谢哦~
二、Demo说明
1)Demo的 %26ldquo;Service端%26rdquo;以本机IIS为宿主,%26ldquo;Client端%26rdquo;以WebForm项目为例。
2)Demo的%26ldquo;Service端%26rdquo;提取数据采用初学者比较容易接受的分层结构进行搭建,分别分为服务层、实体层、数据层。
引用关系如下图所示:
3)Demo以数据库为SqlServer,表User为例(sql语句在下载的压缩包中Init.sql),表结构如下所示:
字段名
列名
数据类型
约束
生成方式
用户编号
UserID
int
主键,必须输入
自动增+1
姓名
Name
varchar(200)
非必须输入
人工输入
密码
Password
varchar(200)
非必须输入
人工输入
描述
Discribe
varchar(800)
非必须输入
人工输入
提交时间
SubmitTime
datetime
非必须输入
人工输入
三、创建Service端宿主
1)创建WCF应用程序命名为:WCF.Demo.Service,如下图:
2)删除默认文件IService.cs与Service.svc。并分别创建增、删、改、查%26rdquo;Add.svc%26rdquo;、%26ldquo;Save.svc%26rdquo;、%26ldquo;Remove.svc%26rdquo;、%26ldquo;Get.svc,Search.svc%26rdquo;,分别对应4个功能的服务应用程序WCF服务应用程序,并创建数据操作层和数据实体层,如下图:
3)增加实体层和数据操作层代码,如下所示:
1 //用户实体 2 [DataContract] 3 public class User 4 { 5 [DataMember] 6 public int UserID { get; set; } 7 [DataMember] 8 public string UserName { get; set; } 9 [DataMember]10 public string Password { get; set; }11 [DataMember]12 public string Discribe { get; set; }13 [DataMember]14 public DateTime SubmitTime { get; set; }15 }16 //数据操作,调用SqlHeler17 public class User18 {19 private static readonly string connectionString = "server=.;database=wcfDemo;uid=sa;pwd=123456;";20 21 //添加22 public static bool Add(Model.User user)23 {24 string sql = string.Format("INSERT INTO [dbo].[User]([UserName],[Password],[Discribe],[SubmitTime]) VALUES('{0}','{1}','{2}','{3}')", user.UserName, user.Password, user.Discribe, user.SubmitTime);25 int result = SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql);26 if (result %26gt; 0)27 return true;28 else29 return false;30 }31 32 //修改33 public static bool Save(Model.User user)34 {35 string sql = string.Format("UPDATE [dbo].[User] SET [UserName] = '{0}',[Discribe] = '{2}',[SubmitTime] = '{3}' WHERE UserID = {4}", user.UserName, user.Password, user.Discribe, user.SubmitTime, user.UserID);36 int result = SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql);37 if (result %26gt; 0)38 return true;39 else40 return false;41 }42 43 //删除44 public static bool Remove(int UserID)45 {46 string sql = string.Format("DELETE FROM [dbo].[User] WHERE UserID = {0}", UserID);47 int result = SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql);48 if (result %26gt; 0)49 return true;50 else51 return false;52 }53 54 //获取用户55 public static Model.User Get(int UserID)56 {57 Model.User user = new Model.User();58 string sql = string.Format("SELECT * FROM [dbo].[User] WHERE UserID = {0}", UserID);59 DataSet ds = SqlHelper.ExecuteDataset(connectionString, CommandType.Text, sql);60 if (ds != null %26amp;%26amp; ds.Tables.Count %26gt; 0)61 {62 foreach (DataRow dr in ds.Tables[0].Rows)63 {64 user.UserID = Convert.ToInt32(dr["UserID"]);65 user.UserName = dr["UserName"].ToString();66 user.Password = dr["Password"].ToString();67 user.Discribe = dr["Discribe"].ToString();68 user.SubmitTime = Convert.ToDateTime(dr["SubmitTime"]);69 }70 }71 return user;72 }73 74 //获取用户列表75 public static List%26lt;Model.User%26gt; GetUsers()76 {77 List%26lt;Model.User%26gt; Users = new List%26lt;Model.User%26gt;();78 string sql = string.Format("SELECT * FROM [dbo].[User]");79 DataSet ds = SqlHelper.ExecuteDataset(connectionString, CommandType.Text, sql);80 if (ds != null %26amp;%26amp; ds.Tables.Count %26gt; 0)81 {82 foreach (DataTable dt in ds.Tables)83 {84 foreach (DataRow dr in dt.Rows)85 {86 Model.User user = new Model.User();87 user.UserID = Convert.ToInt32(dr["UserID"]);88 user.UserName = dr["UserName"].ToString();89 user.Password = dr["Password"].ToString();90 user.Discribe = dr["Discribe"].ToString();91 user.SubmitTime = Convert.ToDateTime(dr["SubmitTime"]);92 Users.Add(user);93 }94 }95 }96 return Users;97 }98 }
4)修改Add接口的代码和实现,如下所示:
1 [ServiceContract] 2 public interface IAdd 3 { 4 [OperationContract] 5 bool DoWork(Model.User user); 6 } 7 8 public class Add : IAdd 9 {10 public bool DoWork(Model.User user)11 {12 return DAL.User.Add(user);13 }14 }
%26nbsp;5)修改Save接口的代码和实现,如下所示:
1 [ServiceContract] 2 public interface ISave 3 { 4 [OperationContract] 5 bool DoWork(Model.User user); 6 } 7 8 public class Save : ISave 9 {10 public bool DoWork(Model.User user)11 {12 return DAL.User.Save(user);13 }14 }
6)修改Remove接口的代码和实现,如下所示:
1 [ServiceContract] 2 public interface IRemove 3 { 4 [OperationContract] 5 bool DoWork(int UserID); 6 } 7 public class Remove : IRemove 8 { 9 public bool DoWork(int UserID)10 {11 return DAL.User.Remove(UserID);12 }13 }
7)修改Search接口的代码和实现,如下所示:
1 [ServiceContract] 2 public interface ISearch 3 { 4 [OperationContract] 5 List%26lt;Model.User%26gt; DoWork(); 6 } 7 8 public class Search : ISearch 9 {10 List%26lt;Model.User%26gt; ISearch.DoWork()11 {12 return DAL.User.GetUsers();13 }14 }
8)修改Get接口的代码和实现,如下所示:
1 [ServiceContract] 2 public interface IGet 3 { 4 [OperationContract] 5 Model.User DoWork(int UserID); 6 } 7 8 public class Get : IGet 9 {10 public Model.User DoWork(int UserID)11 {12 return DAL.User.Get(UserID);13 }14 }
四、部署服务端程序
1)将程序发布,并部署到IIS上,设置端口:8080,如下图所示:
2)以Add.svc服务应用程序为目标,测试部署是否成功,成功后如下图所示:
五、创建Client端Web应用程序
新建WebForm项目WCF.Demo.Client,并创建增删改查文件,Add.aspx,Save.aspx,SearchAndRemove.aspx。如下图所示:
六、使用SvcUtil.exe生成客户端代码和配置
SvcUtil.exe是一个VS命令行工具,该工具位于:C:\Program Files\Microsoft%26nbsp; SDKs\Windows\v7.0A\bin 或 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\一般情况下我们将SvcUtil.exe添加到VS开发工具中方便以后的运用(也可直接使用该命令行工具)。
1)在VS中的 Tools菜单---选择External Tools,打开管理窗口如下图所示:
在Title中输入SvcUtil,Command中选择SvcUtil.exe全路径,Initial%26nbsp; directory栏选择生成的客户端代码和配置文件所放的目录(此处为解决方案所在目录),选上Prompt for arguments,不选上Close on%26nbsp; exit。点击OK.
2)添加完成后,在VS的工具下会出现这个菜单。如下图所示:
3)在Client端添加对服务的引用。打开SvUtil工具,在Arguments里填写服务的地址,如下图:
点击OK后出现下图,说明代码类和配置文件生成成功(在解决方案目标下),如下图所示:
此时代理类和配置文件被下载到解决方案的物理目录中,如下图所示:
七、在Client端使用代理类与配置
将代理类从服务端的物理目录拷贝出来,放到Client端,并适当的修改代码,加入自己需要的名称空间,如下图所示:
使用代码如下所示:
1 //增加 2 public partial class Add : System.Web.UI.Page 3 { 4 Service.AddClient addClient = new Service.AddClient(); 5 protected void Page_Load(object sender, EventArgs e) 6 { 7 8 } 9 10 //提交11 protected void btnSubmit_Click(object sender, EventArgs e)12 {13 Model.User user = new Model.User();14 user.UserName = this.txtUserName.Text;15 user.Password = this.txtPassword.Text;16 user.Discribe = this.txtDiscribe.Text;17 user.SubmitTime = System.DateTime.Now;18 addClient.DoWork(user);19 Response.Write("添加成功!");20 }21 }22 //修改23 public partial class Save : System.Web.UI.Page24 {25 Service.SaveClient saveClient = new Service.SaveClient();26 Service.GetClient getClient = new Service.GetClient();27 protected void Page_Load(object sender, EventArgs e)28 {29 if (!Page.IsPostBack %26amp;%26amp; !string.IsNullOrEmpty(Request.QueryString["UserID"]))30 {31 GetUser();32 }33 }34 35 protected void GetUser()36 {37 int UserID = Convert.ToInt32(Request.QueryString["UserID"]);38 Model.User user = getClient.DoWork(UserID);39 this.txtUserName.Text = user.UserName;40 this.txtDiscribe.Text = user.Discribe;41 }42 43 //提交44 protected void btnSubmit_Click(object sender, EventArgs e)45 {46 int UserID = Convert.ToInt32(Request.QueryString["UserID"]);47 Model.User user = getClient.DoWork(UserID);48 user.UserName = this.txtUserName.Text;49 user.Discribe = this.txtDiscribe.Text;50 saveClient.DoWork(user);51 Response.Write("修改成功!");52 }53 }54 //列表及删除55 public partial class SearchAndRemove : System.Web.UI.Page56 {57 Service.SearchClient searchClient = new Service.SearchClient();58 Service.RemoveClient removeClient = new Service.RemoveClient();59 protected void Page_Load(object sender, EventArgs e)60 {61 if (!Page.IsPostBack)62 {63 GetUsers();64 }65 }66 67 protected void GetUsers()68 {69 this.repUsers.DataSource = searchClient.DoWork();70 this.repUsers.DataBind();71 }72 73 protected void lbtnRemoveCommand(object sender, CommandEventArgs e)74 {75 int UserID = Convert.ToInt32(e.CommandName);76 removeClient.DoWork(UserID);77 Response.Write("删除成功~");78 GetUsers();79 }80 }
将生成的配置文件中的%26nbsp;%26lt;system.serviceModel%26gt;复制到Client的Web.config中,代码如下:
1 %26lt;system.serviceModel%26gt; 2 %26lt;bindings%26gt; 3 %26lt;basicHttpBinding%26gt; 4 %26lt;binding name="BasicHttpBinding_IAdd" closeTimeout="00:01:00" 5 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 6 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 7 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 8 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 9 useDefaultWebProxy="true"%26gt;10 %26lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"11 maxBytesPerRead="4096" maxNameTableCharCount="16384" /%26gt;12 %26lt;security mode="None"%26gt;13 %26lt;transport clientCredentialType="None" proxyCredentialType="None"14 realm="" /%26gt;15 %26lt;message clientCredentialType="UserName" algorithmSuite="Default" /%26gt;16 %26lt;/security%26gt;17 %26lt;/binding%26gt;18 %26lt;binding name="BasicHttpBinding_IRemove" closeTimeout="00:01:00"19 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"20 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"21 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"22 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"23 useDefaultWebProxy="true"%26gt;24 %26lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"25 maxBytesPerRead="4096" maxNameTableCharCount="16384" /%26gt;26 %26lt;security mode="None"%26gt;27 %26lt;transport clientCredentialType="None" proxyCredentialType="None"28 realm="" /%26gt;29 %26lt;message clientCredentialType="UserName" algorithmSuite="Default" /%26gt;30 %26lt;/security%26gt;31 %26lt;/binding%26gt;32 %26lt;binding name="BasicHttpBinding_ISearch" closeTimeout="00:01:00"33 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"34 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"35 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"36 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"37 useDefaultWebProxy="true"%26gt;38 %26lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"39 maxBytesPerRead="4096" maxNameTableCharCount="16384" /%26gt;40 %26lt;security mode="None"%26gt;41 %26lt;transport clientCredentialType="None" proxyCredentialType="None"42 realm="" /%26gt;43 %26lt;message clientCredentialType="UserName" algorithmSuite="Default" /%26gt;44 %26lt;/security%26gt;45 %26lt;/binding%26gt;46 %26lt;binding name="BasicHttpBinding_ISave" closeTimeout="00:01:00"47 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"48 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"49 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"50 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"51 useDefaultWebProxy="true"%26gt;52 %26lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"53 maxBytesPerRead="4096" maxNameTableCharCount="16384" /%26gt;54 %26lt;security mode="None"%26gt;55 %26lt;transport clientCredentialType="None" proxyCredentialType="None"56 realm="" /%26gt;57 %26lt;message clientCredentialType="UserName" algorithmSuite="Default" /%26gt;58 %26lt;/security%26gt;59 %26lt;/binding%26gt;60 %26lt;binding name="BasicHttpBinding_IGet" closeTimeout="00:01:00"61 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"62 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"63 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"64 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"65 useDefaultWebProxy="true"%26gt;66 %26lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"67 maxBytesPerRead="4096" maxNameTableCharCount="16384" /%26gt;68 %26lt;security mode="None"%26gt;69 %26lt;transport clientCredentialType="None" proxyCredentialType="None"70 realm="" /%26gt;71 %26lt;message clientCredentialType="UserName" algorithmSuite="Default" /%26gt;72 %26lt;/security%26gt;73 %26lt;/binding%26gt;74 %26lt;/basicHttpBinding%26gt;75 %26lt;/bindings%26gt;76 %26lt;client%26gt;77 %26lt;endpoint address="http://localhost:8080/Add.svc" binding="basicHttpBinding"78 bindingConfiguration="BasicHttpBinding_IAdd" contract="IAdd"79 name="BasicHttpBinding_IAdd" /%26gt;80 %26lt;endpoint address="http://localhost:8080/Remove.svc" binding="basicHttpBinding"81 bindingConfiguration="BasicHttpBinding_IRemove" contract="IRemove"82 name="BasicHttpBinding_IRemove" /%26gt;83 %26lt;endpoint address="http://localhost:8080/Search.svc" binding="basicHttpBinding"84 bindingConfiguration="BasicHttpBinding_ISearch" contract="ISearch"85 name="BasicHttpBinding_ISearch" /%26gt;86 %26lt;endpoint address="http://localhost:8080/Save.svc" binding="basicHttpBinding"87 bindingConfiguration="BasicHttpBinding_ISave" contract="ISave"88 name="BasicHttpBinding_ISave" /%26gt;89 %26lt;endpoint address="http://localhost:8080/Get.svc" binding="basicHttpBinding"90 bindingConfiguration="BasicHttpBinding_IGet" contract="IGet"91 name="BasicHttpBinding_IGet" /%26gt;92 %26lt;/client%26gt;93 %26lt;/system.serviceModel%26gt;
%26nbsp;
-------------------------最终效果-----------------------
添加:
修改:
%26nbsp;列表及删除:
%26nbsp;
八、源码下载
%26nbsp;点我下载本文章Demo
九、wcf入门教程目录
无废话WCF入门教程一[什么是WCF]
无废话WCF入门教程二[WCF应用的通信过程]
无废话WCF入门教程三[WCF的宿主]
无废话WCF入门教程四[WCF的配置文件]
无废话WCF入门教程五[WCF的通信模式]
版权:http://www.cnblogs.com/iamlilinfeng
索引
前言
说明
创建Service端
部署服务
创建Client端
生成代理
使用代理
源码下载
教程目录
- 无废话WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程六[一个简单的Demo]
- WCF入门教程六[一个简单的Demo]
- 无废话WCF入门教程
- WCF入门教程——一个简单Demo(六)
- 无废话WCF入门教程一
- 无废话WCF入门教程二[WCF应用的通信过程]
- 无废话WCF入门教程三[WCF的宿主]
- 无废话WCF入门教程四[WCF的配置文件]
- 无废话WCF入门教程五[WCF的通信模式]
- 无废话WCF入门教程二[WCF应用的通信过程]
- 无废话WCF入门教程三[WCF的宿主]
- 无废话WCF入门教程四[WCF的配置文件]
- 无废话WCF入门教程五[WCF的通信模式]
- gh0st源码阅读--监控代码
- The Euler function
- 互联网数据响应时间计算公式
- jsp操作Access
- llvm各种格式文件转换图
- 无废话WCF入门教程六[一个简单的Demo]
- LeetCode 循环链表判断
- 题目1045:百鸡问题
- 第8天 好累啊..继续刷题吧
- hysbz 1036 树的统计Count 树链剖分
- 寒冰王座
- hdu4280 Island Transport 最大流dinic
- 怎么在图片上做文字效果
- Linux 汇编语言(GNU GAS汇编)开发指南