WCF学习——构建第二个WCF应用程序(六)

时间:2022-08-23 09:41:36

一、创建客户端应用程序

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

  1.在菜单栏上,依次选择“文件”、“添加”、“新建项目”。

  2.在“添加新项目”对话框中,展开 “Visual C#”节点,选择“Web”节点下的VS2012,然后选择“ASP.NET MVC4”。

  3.在“名称”文本框中,输入 ConsoleClient,然后选择“确定”按钮。 如下图。

  WCF学习——构建第二个WCF应用程序(六)

   4.选择基本模板页  Razor视图  点击确定

  WCF学习——构建第二个WCF应用程序(六)

  5.  在解决方案资源管理器中,选择 ConsoleClient项目节点。

6.在菜单栏上,选择“项目”、“设为启动项目”,并添加引用

二、添加服务引用

  

  1.在菜单栏上,依次选择“项目”、“添加服务引用”、“高级”、添加Web引用。

  2.在“URL”对话框中,将WCF服务的 URL(http://127.0.0.1:9898/BookService/wcf) 将粘贴在“地址”字段中。

  3.或者点击“——>”按钮,出现的WCF服务地址中选择需要的URL。如下图。

  WCF学习——构建第二个WCF应用程序(六)

   4. 选择“添加引用”按钮以添加服务引用。

三、创建WcfCommon 项目

  1.在菜单栏上,依次选择“文件-->新建-->项目”,或者如下图在“解决方案资源管理器”中使用鼠标右键,弹出快捷菜单。 如下图。

  WCF学习——构建第二个WCF应用程序(六)

  2.在“添加新项目”对话框中,展开 “Visual C#”和“Windows”节点,然后选择“类库”模板。

  3.在“名称”文本框中,输入 WcfCommon,然后选择“确定”按钮。 如下图。

  WCF学习——构建第二个WCF应用程序(六)

   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-->创建控制器)  如下图

  WCF学习——构建第二个WCF应用程序(六)

  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()   添加视图 选择,如下图所示

  

  WCF学习——构建第二个WCF应用程序(六)

  

  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时出现下列错误,如图所示

  WCF学习——构建第二个WCF应用程序(六)

  

  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&period;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. dos 下删除文件、文件夹

    删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...

  2. php中or的含义

    or其实是Php中的短路或 经常看到这样的语句: $file = fopen($filename, r) or die("抱歉,无法打开: $filename"); or在这里是这 ...

  3. magento安装新插件后后台配置空白解决办法

    前段时间,安装完Magento插件以后,就会出现空白或者404问题,在某些运营中的magento网站,安装新插件后后台配置空白解决. 1 将sysytem->toos->Compilati ...

  4. ctrl &plus; d 在phpstorm 和 eclipse 中的不同含义

    Ctrl + d 在phpstrom是复制一行,非常的方便,但是eclipse中却是删除一行,非常的特别.感觉上,phpstorm更注重鼠标,但eclipse貌似更多鼠标和键盘的操作, 默认情况下[p ...

  5. 【分布式计算】MapReduce的替代者-Parameter Server

    原文:http://blog.csdn.net/buptgshengod/article/details/46819051 首先还是要声明一下,这个文章是我在入职阿里云1个月以来,对于分布式计算的一点 ...

  6. 【IE】trim&lpar;&rpar;方法失效

    今天用了$.ajax异步提交,结果在ie8里面报错了,说不支持此对象,找了半天没找到什么问题. 后来发现是我data里面的参数传递,里面有个参数用到了trim()方法,这个方法在ie8里面是失效的. ...

  7. ReactiveCocoa学习总结&lpar;1&rpar;

    1. 它是什么? 官方解释: [RACSignal] is a push-driven stream with a focus on asynchronous event delivery throu ...

  8. Java并发编程实战 之 线程安全性

    1.什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全 ...

  9. PMP测试实践- 内附PMBOK中字与备考资料

    最近笔者考了PMP(Project Management Professional )项目管理专业人士认证考试,主要为了系统学习下项目管理的整个过程与方法,结合PMP的理论与工作实践去更好的完成项目工 ...

  10. s5-6 Linux 标准输出 系统优化 目录结构

    标准输出 重定向符号 #>   1>    标准输出重定向  先把文件的内容清空   把内容放在文件的最后一行 #>>  1>>   追加重定向      把内容放 ...