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; }
}
}
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 ? : 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 = ; 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 ;
} /// <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 > )
{
return ConvertToModel(ds.Tables[].Rows[]);
}
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 > )
{
return ConvertToList(ds.Tables[]);
}
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) > ;
}
}
}
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("添加成功!");
}
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入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- WCF实现事件通知相关应用技巧介绍
WCF实现事件通知是一个比较容易掌握的知识点,不过在实现的过程中,我们还是需要注意一些事项,以保证功能的完善性. WCF中有一些方法的应用对于初学者来说还是比较容易应用.只要熟练的联系这些方法操作,一 ...
- WCF 4.0 使用说明
WCF 4.0开发说明,工具VS2013 ,IIS,使用http协议 打开VS2013,新建项目Visual C#>Web>Asp.NET Web应用程序,添加相关引用: System.S ...
- 我的WCF摸爬滚打之路(1)
等了好久终于等到今天!盼了好久终于把梦实现……哈哈,仅以此歌词来庆祝我为期3天的wcf学习之路圆满结束. 今天写这个文章的目的在于记录一下我自己在学习WCF的时候碰到的一些问题,俗话说,好记心不如烂笔 ...
- .Net remoting, Webservice,WCF,Socket区别
传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding
Jquery ajax调用WCF服务 例子效果如下:原界面 点击按钮GetList get后,通过指定的Url获取数据添加到table 新建一个控制台项目,添加IContract.cs,DBServi ...
- 每天进步一点--WCF学习笔记
最近买了一本书WCF服务编程,重头再开始了解学习WCF,现将学习记录,以便后来复习,也希望和大家一起进步. WCF用终结点表示一种组成关系,终结点就是地址.契约与绑定的混合品,即 地址(Address ...
- C#多线程介绍(下)
转载原文:这里是链接内容 转载原文:这里写链接内容 转载原文:这里写链接内容 (重要事情说三遍) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个 ...
随机推荐
- Git强制拉取覆盖本地 Pull force
git fetch --all git reset --hard origin/master git pull 单条执行 git fetch --all && git reset -- ...
- Solr --- Group查询与Facet区别
简介 facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索. group则类似于关系数据库的group by,可以用于一个或者几个字段 ...
- js 解决图片居中问题
下述方法能够解决图片居中问题: (1)宽一些或者高一些(相对父元素的大小):图片在父元素的可视范围内显示图片的中间位置 (2)小一些(相对父元素的大小):图片在父元素的可视范围内居中显示 实现原理:根 ...
- python数据结构之链表(一)
数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...
- c++官方文档-枚举-联合体-结构体-typedef-using
#include<iostream> #include <new> #include<stdio.h> using namespace std; /** * url ...
- maven 在pom.xml 中指定仓库位置
...... 在pom.xml 中添加 仓库位置(这样遇到私服没有的依赖,就会去这下载) </properties> <repositories><!-- 代码库 --& ...
- leetcode551
public class Solution { public bool CheckRecord(string s) { ; ; ; var preChar = '\0'; ; i < s.Len ...
- django 使用多个数据库
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...
- IP Editor IP控件
HWND hIpEdit; void __fastcall TForm2::FormCreate(TObject *Sender) { hIpEdit = CreateWindow(WC_IPADDR ...
- JS、CSS以及img对DOMContentLoaded事件的影响
最近在做性能有关的数据上报,发现了两个非常有意思的东西:Chrome开发者工具的Timeline分析面板,以及DOMContentLoaded事件.一个是强大的令人发指的性能分析工具,一个是重要的性能 ...