一、创建客户端应用程序

  若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据。若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据。

  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应用程序(六)的更多相关文章

  1. WCF学习——构建第二个WCF应用程序(四)

    一.WCF服务端应用程序 1.创建WCF服务端应用程序项目 打开Visual Studio 2013,在菜单上点击文件->新建->项目->WCF服务应用程序.在弹出界面的" ...

  2. WCF学习——构建第二个WCF应用程序(五)

    一.创建数据服务 1.在“解决方案资源管理器”中,使用鼠标左键选中“WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 2.在“添加新项”对话框中,选择“Web”节点,然后选 ...

  3. WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】

    http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...

  4. WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】

    http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...

  5. 1.WCF学习--创建简单的WCF服务

    一.基本了解WCF 1.面向服务代表的是一种设计理念,和面向对象.面向组件一样,体现的是一种对关注点进行分解的思想,面向服务是和技术无关的 2.WCF需要依存一个运行着的宿主进程,服务寄宿就是为服务指 ...

  6. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  7. WCF 学习总结2 -- 配置WCF

    前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫.现在回 ...

  8. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】

    http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...

  9. WCF学习——构建一个简单的WCF应用(一)

    本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...

随机推荐

  1. smarty的学习计划(1)

    1.什么事smarty? 不知道,smarty是一个使用PHP写出来的模板引擎,它提供了逻辑外在内容的分离 2.smarty优点: a.速度:成熟的模板引擎技术 b.编译型:采用smarty编写的程序 ...

  2. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  3. 瀑布流布局使用详解——JQuery插件Isotope(动态实现子项目筛选)

    瀑布流布局,听起来听牛逼的样子,其实就是简单的子元素筛选功能.不过这一功能在网站页面布局当中还是很常用的,特别是在电商网站中 经常会有点一个钮筛选,然后页面的子元素刷的以下变了样.接下来,我们先简单介 ...

  4. servlet context 和 servlet config

    servletConfig Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象,该对象中包含了servlet的<init-para ...

  5. servlet多线程

    一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组线程叫做工作者线程(Wor ...

  6. Cohort Analysis and LifeCycle Grids mixed segmentation with R(转)

    This is the third post about LifeCycle Grids. You can find the first post about the sense of LifeCyc ...

  7. 【知识整理】惊现RecyclerView内部Bug???别急,我们慢慢解决它~

    一.写在前面 这也是久违的一整个月没有写Blog,也是由于近期给妹纸找工作,各种坑蒙拐骗,然而都没卵用.额,广大朋友们,成都需要软件测试.线上运维.产品助理的伙伴,赶紧私聊我了.这妹纸,学习能力挺好, ...

  8. JavaSE教程-02Java基本语法-练习

    请说出下面的运算结果及解释为什么 System.out.println(1+1+"1");//? System.out.println("1"+1+1);//? ...

  9. 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)

    因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...

  10. jquery表单序列化

    $(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...