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 ...
随机推荐
- 零售业山重水复,全景行柳暗花明——VR全景智慧城市
对今天的中国来说,寻找经济转型的突破口,寻找经济权力的新霸主,零售业应该当仁不让. 零售业正在经历一场脱胎换骨的改造.一方面零售额达到前所未有的水平,另一方面,传统零售商也面临诸多挑战,其中之一,便是 ...
- js导出CSV
<html> <head> <meta http-equiv="content-type" content="text/html; char ...
- 运维老鸟教你安装centos6.5如何选择安装包
标签:老男孩教育 Centos6.5安装选包原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.c ...
- 【JAVAWEB学习笔记】11_XML&反射
解析XML总结(SAX.Pull.Dom三种方式) 图一 XML的解析方式 图二 XML的Schema的约束 反射的简单介绍: 反射 1.什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行 ...
- Android官方架构组件介绍之LifeCycle
Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...
- iOS 证书详情介绍
1.Certification(证书)安装证书后使这台电脑就有开发APP和真机调试的功能. 证书分为开发证书(Developer Certification)和发布证书(Distribution Ce ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- 笔记本shift变粘贴,粘滞键设置已关闭
之前手贱吧,拿湿抹布擦了擦笔记本电脑的自带键盘,然后部分按键失灵了. 本想着反正也都是在寝室用的,趁机找借口买了个机械键盘,啪啪啪... 刚开始好好的,后来发现一按shift就会粘贴,百度了下都说是粘 ...
- excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史
前两天,一个朋友问我,有没有办法在excel里实现一个表单里是原始数据,在另一个表单里显示搜索到的行,搜索关键词可用~分隔开,并把搜索历史记录下来? 我想了想,用vba实现肯定可以啊,但是我又在想,有 ...
- 调整分区大小(ext2\ext3\ext4)
现在的时间是2017年5月27日 我想说调整分区大小没那么麻烦,至少我直接将一个ext3格式分区从50G减少到了30G. 步骤如下 1 首先确保那个分区是没被挂载的. 2 调整分区大小,但是其实并没有 ...