WCF的例子

Posted 邢帅杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WCF的例子相关的知识,希望对你有一定的参考价值。

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; }
    }
}
View Code

 

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
    }
}
View Code

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);
    }
}
View Code

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;
        }
    }
}
View Code

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 Files\\Microsoft 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全路径》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("添加成功!");
        }
View Code

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

 

以上是关于WCF的例子的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)

WCF的例子

结合 WPF + WCF + 实体框架的好例子 [关闭]

如何创建片段以重复变量编号中的代码行

WCF 数据服务 + 带有枚举的实体