WCF学习——构建第二个WCF应用程序(六)
一、创建客户端应用程序
若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据。若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据。
1.在菜单栏上,依次选择“文件”、“添加”、“新建项目”。
2.在“添加新项目”对话框中,展开 “Visual C#”节点,选择“Web”节点下的VS2012,然后选择“ASP.NET MVC4”。
3.在“名称”文本框中,输入 ConsoleClient,然后选择“确定”按钮。 如下图。
4.选择基本模板页 Razor视图 点击确定
5. 在解决方案资源管理器中,选择 ConsoleClient项目节点。
6.在菜单栏上,选择“项目”、“设为启动项目”,并添加引用
二、添加服务引用
1.在菜单栏上,依次选择“项目”、“添加服务引用”、“高级”、添加Web引用。
2.在“URL”对话框中,将WCF服务的 URL(http://127.0.0.1:9898/BookService/wcf) 将粘贴在“地址”字段中。
3.或者点击“——>”按钮,出现的WCF服务地址中选择需要的URL。如下图。
4. 选择“添加引用”按钮以添加服务引用。
三、创建WcfCommon 项目
1.在菜单栏上,依次选择“文件-->新建-->项目”,或者如下图在“解决方案资源管理器”中使用鼠标右键,弹出快捷菜单。 如下图。
2.在“添加新项目”对话框中,展开 “Visual C#”和“Windows”节点,然后选择“类库”模板。
3.在“名称”文本框中,输入 WcfCommon,然后选择“确定”按钮。 如下图。
4. 在已经创建成功的WcfCommon项目中添加一个XMLHelper .CS文件,写如下代码。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; using System.IO; namespace WcfCommon { public class XmlHelper { /// <summary> /// 反序列化成对象 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="filename">XML文件路径</param> /// <returns></returns> public static T ParseXML<T>(string filename) { T obj = default(T); XmlSerializer serializer = new XmlSerializer(typeof(T)); /* If the XML document has been altered with unknown nodes or attributes, handle them with the UnknownNode and UnknownAttribute events.*/ // A FileStream is needed to read the XML document. FileStream fs = new FileStream(filename, FileMode.Open); try { obj = (T)serializer.Deserialize(fs); } catch (System.Exception ex) { string s = ex.Message; throw ex; } finally { fs.Close(); } return obj; } /// <summary> /// 反序列化成对象 /// </summary> /// <param name="filename">XML文件路径</param> /// <param name="type">对象类型</param> /// <returns></returns> public static object ToObject(string filename, Type type) { object obj; XmlSerializer serializer = new XmlSerializer(type); FileStream fs = new FileStream(filename, FileMode.Open); try { obj = serializer.Deserialize(fs); } catch (System.Exception ex) { string s = ex.Message; throw ex; } finally { fs.Close(); } return obj; } /// <summary> /// 反序列化成对象 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="data">XML数据对象字符串</param> /// <returns></returns> public static T DeSerializer<T>(string data) { T obj = default(T); XmlSerializer serializer = new XmlSerializer(typeof(T)); try { using (StringReader sr = new StringReader(data)) { XmlSerializer xz = new XmlSerializer(typeof(T)); obj = (T)serializer.Deserialize(sr); } } catch (System.Exception ex) { string s = ex.Message; throw ex; } return obj; } /// <summary> /// 创建XML文件 /// </summary> /// <param name="fullFileName">XML文件名</param> /// <param name="data">XML字符串</param> public static void CreateXML(string fullFileName, string data) { using (StreamWriter sw = new StreamWriter(fullFileName, false, Encoding.UTF8)) { sw.Write(data); } } /// <summary> /// 把对象转换成字符串 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="t">对象实体</param> /// <returns></returns> public static string ToXML<T>(T t) { using (StringWriter sw = new StringWriter()) { XmlSerializer xz = new XmlSerializer(t.GetType()); xz.Serialize(sw, t); return sw.ToString(); } } } }
四、调用服务信息
1.创建一个控制器WcfController(右键Controllers-->创建控制器) 如下图
2.控制器生成的代码 如下图所示
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ConsoleClient.Controllers { public class WcfController : Controller { // // GET: /Wcf/ public ActionResult Index() { return View(); } } }
3.右击动作方法Index() 添加视图 选择,如下图所示
4.点击确定 生成的代码如下
@model WcfModel.Books @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <fieldset> <legend>Books</legend> <div class="display-label"> @Html.DisplayNameFor(model => model.Title) </div> <div class="display-field"> @Html.DisplayFor(model => model.Title) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.Author) </div> <div class="display-field"> @Html.DisplayFor(model => model.Author) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.PublisherId) </div> <div class="display-field"> @Html.DisplayFor(model => model.PublisherId) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.PublishDate) </div> <div class="display-field"> @Html.DisplayFor(model => model.PublishDate) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.ISBN) </div> <div class="display-field"> @Html.DisplayFor(model => model.ISBN) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.UnitPrice) </div> <div class="display-field"> @Html.DisplayFor(model => model.UnitPrice) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.ContentDescription) </div> <div class="display-field"> @Html.DisplayFor(model => model.ContentDescription) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.TOC) </div> <div class="display-field"> @Html.DisplayFor(model => model.TOC) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.CategoryId) </div> <div class="display-field"> @Html.DisplayFor(model => model.CategoryId) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.Clicks) </div> <div class="display-field"> @Html.DisplayFor(model => model.Clicks) </div> </fieldset> <p> @Html.ActionLink("Edit", "Edit", new { id=Model.Id }) | @Html.ActionLink("Back to List", "Index") </p> </body> </html>
5.启动Hosting服务
6.编写控制器的方法如下
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ConsoleClient.Controllers { public class WcfController : Controller { // // GET: /Wcf/ public ActionResult Index() { BookServiceRef.BookService bookService = new BookServiceRef.BookService(); ")); return View(book); } } }
7.启动ConsoleClient时出现下列错误,如图所示
8.错误原因:Wcf不能直接返回对象或者数组,只能返回string类型的, 其他类型还没有测试,现在进行修改契约(IBookService)和契约服务(BookService)转换成xml 和通过xml转换成对象或者集合,如图所示
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using WcfModel; namespace WcfService { /// <summary> /// 书籍协定 /// </summary> [ServiceContract] public interface IBookService { /// <summary> /// 通过Id得到书籍信息 /// </summary> /// <param name="Id"></param> /// <returns></returns> [OperationContract] string GetBook(string id); /// <summary> /// 得到所有书籍 /// </summary> /// <returns></returns> [OperationContract] string GetList(); /// <summary> /// 添加书籍 /// </summary> /// <param name="books"></param> /// <returns></returns> [OperationContract] string AddBook(Books books); /// <summary> /// 删除书籍 /// </summary> /// <param name="id"></param> /// <returns></returns> [OperationContract] string delBook(int id); /// <summary> /// 修改书籍 /// </summary> /// <param name="books"></param> /// <returns></returns> [OperationContract] string editBook(Books books); } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using WcfCommon; using WcfModel; namespace WcfService { /// <summary> /// 书籍服务协定实现 /// </summary> public class BookService : IBookService { BookShopPlusEntities book = new BookShopPlusEntities(); /// <summary> /// 通过Id得到书籍信息 /// </summary> /// <param name="Id"></param> /// <returns></returns> public string GetBook(string id) { int bookId = Convert.ToInt32(id); try { //var books = (from s in book.Books // where s.Id == id // select s).SingleOrDefault(); var books = book.Books.Where(e => e.Id.Equals(bookId)).SingleOrDefault(); return XmlHelper.ToXML<Books>(books); } catch (Exception ex) { throw ex; } } /// <summary> /// 得到所有书籍 /// </summary> /// <returns></returns> public string GetList() { try { List<Books> books = ().ToList<Books>(); return XmlHelper.ToXML<List<Books>>(books); } catch (Exception ex) { throw ex; } } /// <summary> /// 添加书籍 /// </summary> /// <param name="books"></param> /// <returns></returns> public string AddBook(Books books) { try { book.Books.Add(books); //保存到数据库 book.SaveChanges(); } catch (Exception ex) { throw ex; } return "true"; } /// <summary> /// 删除书籍 /// </summary> /// <param name="id"></param> /// <returns></returns> public string delBook(int id) { try { var books = book.Books.Where(e => e.Id == id).SingleOrDefault(); book.Books.Remove(books); book.SaveChanges(); } catch (Exception ex) { throw ex; } return "true"; } /// <summary> /// 修改书籍 /// </summary> /// <param name="books"></param> /// <returns></returns> public string editBook(Books books) { try { //得到一条数据 var bk = book.Books.Where(e => e.Id == books.Id).SingleOrDefault(); //进行修改 bk.Title = books.Title; bk.Author = books.Author; bk.PublishDate = books.PublishDate; bk.UnitPrice = books.UnitPrice; bk.TOC = books.TOC; //提交 book.SaveChanges(); } catch (Exception ex) { throw ex; } return "true"; } } }
9.运行程序
WCF学习——构建第二个WCF应用程序(六)的更多相关文章
- WCF学习——构建第二个WCF应用程序(四)
一.WCF服务端应用程序 1.创建WCF服务端应用程序项目 打开Visual Studio 2013,在菜单上点击文件->新建->项目->WCF服务应用程序.在弹出界面的" ...
- WCF学习——构建第二个WCF应用程序(五)
一.创建数据服务 1.在“解决方案资源管理器”中,使用鼠标左键选中“WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 2.在“添加新项”对话框中,选择“Web”节点,然后选 ...
- WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】
http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...
- WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】
http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...
- 1.WCF学习--创建简单的WCF服务
一.基本了解WCF 1.面向服务代表的是一种设计理念,和面向对象.面向组件一样,体现的是一种对关注点进行分解的思想,面向服务是和技术无关的 2.WCF需要依存一个运行着的宿主进程,服务寄宿就是为服务指 ...
- WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】
WCF Interview Questions – Part 4 This WCF service tutorial is part-4 in series of WCF Interview Qu ...
- WCF 学习总结2 -- 配置WCF
前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫.现在回 ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
- WCF学习——构建一个简单的WCF应用(一)
本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...
随机推荐
- 关于XML(可扩展标记语言)的基础知识与写法------2017-05-18
XML(Extensible Markup Language) HTML:超文本标记语言,主要用来展示 XML:可扩展标记语言,用来做数据传输XML特点: 1.树状结构,有且只有一个根 2.标签名 ...
- SSH抛出org.apache.ibatis.exceptions.PersistenceException: 异常
抛出的异常类容如下 如果遇到这个异常,那么肯定是你在配置事物切面时出错,或者是你的写的事物的方法名称没有和这里的配置对应: 你需要注意如下几点: 1.你的名称必须是以英文开头 2.在你用着事物方法的名 ...
- OpenCV探索之路(十五):角点检测
角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你 ...
- 抱歉,您必须拥有一个终端来执行 sudo
Linux ssh执行远端服务器sudo命令时有如下报错: sudo: sorry, you must have a tty to run sudo sudo:抱歉,您必须拥有一个终端来执行 sudo ...
- 基于binlog来分析mysql的行记录修改情况(python脚本分析)
最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- Mac苹果系统 多系统启动:The rEFInd Boot Manager
苹果系统 多系统启动 下载安装REFIT: 首先安装一下:REFIT, 在这个页面下载: http://refit.sourceforge.net/#download 选择mac disk image ...
- MySql的学习笔记
良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询: 五种查询 where g ...
- CSS3学习系列之选择器(二)
first-child选择器和last-child选择器 first-child指定第一个元素.last-child指定最后一个子元素. 例如: <!DOCTYPE html> <h ...
- C# 中文在URL中的编码
UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节. 不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节. //按照UTF-8进行编码 string tempSearc ...