Demo的 “Service端”以本机IIS为宿主,“Client端”以WebForm项目为例。
1、新建项目:WCF》WCF Service Application;
2、删除默认文件IService.cs与Service.svc。并分别创建增、删、改、查”Add.svc”、“Save.svc”、“Remove.svc”、“Get.svc,Search.svc”,分别对应4个功能的服务应用程序WCF服务应用程序,并创建数据操作层和数据实体层
3、增加实体层和数据操作层代码,注意实体层类和属性添加了数据契约 [DataContract] [DataMember]
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using System.Runtime.Serialization; namespace Model { [DataContract] public class UserInfo { [DataMember] public int ID { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Pwd { get; set; } [DataMember] public string Discribe { get; set; } [DataMember] public DateTime SubmitTime { get; set; } } }
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class UserInfo { #region Convert Method public Model.UserInfo ConvertToModel(DataRow row) { Model.UserInfo model = new Model.UserInfo(); model.ID = row["ID"] == DBNull.Value ? 0 : Convert.ToInt32(row["ID"]); model.Name = row["Name"] + ""; model.Pwd = row["Pwd"] + ""; model.Discribe = row["Discribe"] + ""; model.SubmitTime = row["SubmitTime"] == DBNull.Value ? DateTime.Now : Convert.ToDateTime(row["SubmitTime"]); return model; } public List<Model.UserInfo> ConvertToList(DataTable dt) { List<Model.UserInfo> list = new List<Model.UserInfo>(); if (dt != null) { for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; list.Add(ConvertToModel(row)); } } return list; } #endregion #region 代码生成 /// <summary> /// 添加一条数据 /// </summary> /// <param name="model">数据实体</param> /// <returns></returns> public int Append(Model.UserInfo model) { SqlParameter[] para = { new SqlParameter("@Discribe",model.Discribe), new SqlParameter("@Name",model.Name), new SqlParameter("@Pwd",model.Pwd), new SqlParameter("@SubmitTime",model.SubmitTime) }; StringBuilder cmdText = new StringBuilder(); cmdText.Append(@"INSERT INTO UserInfo( Name ,Pwd ,Discribe ,SubmitTime ) VALUES( @Name ,@Pwd ,@Discribe ,@SubmitTime );select @@IDENTITY"); object obj = SqlHelper.GetScalar(CommandType.Text, cmdText.ToString(), para); if (obj != null && obj != DBNull.Value) { return Convert.ToInt32(obj); } return 0; } /// <summary> /// 删除一个实体 /// </summary> /// <param name="_entity"></param> /// <returns></returns> public int DeleteEntity(System.Int32 ID) { SqlParameter[] para = { new SqlParameter("@ID",ID), }; StringBuilder cmdText = new StringBuilder(); cmdText.Append(@"DELETE FROM [UserInfo] WHERE ID=@ID"); return SqlHelper.ExecuteNonQuery(CommandType.Text, cmdText.ToString(), para); } /// <summary> /// 修改一个实体 /// </summary> /// <param name="_entity"></param> /// <returns></returns> public int ModifyEntity(Model.UserInfo model) { SqlParameter[] para = { new SqlParameter("@ID",model.ID), new SqlParameter("@Discribe",model.Discribe), new SqlParameter("@Name",model.Name), new SqlParameter("@Pwd",model.Pwd), new SqlParameter("@SubmitTime",model.SubmitTime) }; StringBuilder cmdText = new StringBuilder(); cmdText.Append(@"UPDATE [UserInfo] SET [Name]=@Name ,[Discribe]=@Discribe ,[Pwd]=@Pwd ,[SubmitTime]=@SubmitTime WHERE [ID]=@ID"); return SqlHelper.ExecuteNonQuery(CommandType.Text, cmdText.ToString(), para); } /// <summary> /// 获得一个实体根据ID /// </summary> /// <param name="_id"></param> /// <returns></returns> public Model.UserInfo GetEntity(int ID) { SqlParameter[] para = { new SqlParameter("@ID",ID), }; StringBuilder cmdText = new StringBuilder(); cmdText.Append(@"SELECT * FROM UserInfo WHERE ID=@ID"); DataSet ds = SqlHelper.GetDataSet(CommandType.Text, cmdText.ToString(), para); if (ds != null && ds.Tables.Count > 0) { return ConvertToModel(ds.Tables[0].Rows[0]); } return null; } /// <summary> /// 查询所有数据 /// </summary> /// <returns></returns> public List<Model.UserInfo> GetList() { StringBuilder cmdText = new StringBuilder(); cmdText.Append(@"SELECT * FROM UserInfo"); DataSet ds = SqlHelper.GetDataSet(CommandType.Text, cmdText.ToString(), null); if (ds != null && ds.Tables.Count > 0) { return ConvertToList(ds.Tables[0]); } return new List<Model.UserInfo>(); } #endregion } }
4、接口修改,其余接口对比着也改下。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfService1 { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IAdd”。 [ServiceContract] public interface IAdd { [OperationContract] bool DoWork(Model.UserInfo model); } }
5、Add.svc服务修改,参数是UserInfo类型,已经加注了数据契约;其余服务也对比着改下。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfService1 { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Add”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Add.svc 或 Add.svc.cs,然后开始调试。 public class Add : IAdd { public bool DoWork(Model.UserInfo model) { return new DAL.UserInfo().Append(model) > 0; } } }
6、发布与部署,编译后把WCF服务项目发布出来,部署到IIS上。我部署后是 http://localhost:8011/,输入到浏览器上,会自动出现所有服务。
例:http://localhost:8011/Add.svc,会提示已创建服务。
7、创建一个WebForm项目,增加一个Add.aspx页面。使用SvcUtil.exe生成客户端代码和配置。
8、使用SvcUtil.exe生成客户端代码和配置
SvcUtil.exe是一个VS命令行工具,该工具位于:C:Program FilesMicrosoft SDKsWindowsv7.0Ain 或 C:Program Files (x86)Microsoft SDKsWindowsv7.0Ain一般情况下我们将SvcUtil.exe添加到VS开发工具中方便以后的运用(也可直接使用该命令行工具)。
1)在VS中的Tools(工具)菜单---选择External Tools(外部工具),打开管理窗口》添加》
Title(标题)输入SvcUtil》Command(命令)选择SvcUtil.exe全路径》Arguments(参数)为空》Initial Directory(初始目录)输入$(SolutionDir)》下面的复选框勾选 Prompt for argument(提示输入参数),其他不勾
Initial directory(初始目录)栏选择生成的客户端代码和配置文件所放的目录(此处为解决方案所在目录),选上Prompt for arguments(提示输入参数)。
2)添加完成后,在VS的工具下会出现SvcUtil这个菜单。
3)在WebForm端添加对服务的引用。打开SvUtil工具,在Arguments(参数)里填写服务的地址:http://localhost:8011/Add.svc,
点确定,会在解决方案根目录下生产三个文件:Add.cs、output.config、Service2.cs;这是代理类和配置文件。
9、在Client端使用代理类与配置;将代理类从服务端的物理目录拷贝出来,放到Client端,并适当的修改代码,加入自己需要的名称空间,
使用方法:
protected void Button1_Click(object sender, EventArgs e) { AddClient addClient = new AddClient(); Model.Add.UserInfo user = new Model.Add.UserInfo(); user.Name = this.txtName.Text; user.Discribe = this.txtDiscribe.Text; user.Pwd = this.txtPwd.Text; user.SubmitTime = System.DateTime.Now; addClient.DoWork(user); Response.Write("添加成功!"); }
10、将生成的配置文件中的 <system.serviceModel>复制到Client的Web.config中,需要复制的节点为 bindings、client。
来源:
http://www.cnblogs.com/iamlilinfeng/p/4083827.html
http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html
http://www.cnblogs.com/iamlilinfeng/archive/2012/09/26/2703759.html
http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html