首页 > 其他分享 >WCF学习-第二个示例

WCF学习-第二个示例

时间:2022-12-19 18:00:24浏览次数:33  
标签:string 示例 Text System new 第二个 book WCF using

二、WCF服务端应用程序

第一步,创建WCF服务应用程序项目

打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序。在弹出界面的“名称”对应的文本框中输入“SCF.WcfService”,然后点击“确定”按钮。如下图。

第二步 , 安装Entity Framework

1) 使用NuGet下载最新版的Entity Framework 6.1.3。在解决方案资源管理器中——>在项目SCF.WcfService上鼠标右键单击——>弹出一个菜单,选中“管理解决方案的NuGet程序包”,打开NuGet程序包管理界面。如下图。

2) 在NuGet程序包管理界面中搜索 Entity,找到最新版本Entity Framework,点击安装。如下图。

3) 安装完成之后,如下图。

第三步,创建 SCF.Common 项目

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

  2. 在“添加新项目”对话框中,展开 “Visual C#”和“Windows”节点,然后选择“类库”模板。
  3. 在“名称”文本框中,输入 SCF.Common,然后选择“确定”按钮。 如下图。

  4. 在已经创建成功的SCF.Common项目中添加一个XMLHelper .CS文件,写如下代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
 
namespace SCF.Common
{
    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. 在菜单栏上,依次选择“文件”、“新建”、“项目”。
  2. 在“新建项目”对话框中,展开 “Visual C#”和“Winodws”节点,然后选择“类库”模板,在“名称”对话框中输入“SCF.Model”,然后点击确定按钮。 创建SCF.Model项目。如下图。

  3. 通过NuGet安装相关的组件,具体操作步骤参见第一步。如下图中黄框中的组件。

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

  5. 在“添加新项”对话框中,选择“数据”节点,然后选择“ADO.NET 实体数据模型”项。

  6. 在“名称”文本框中,输入 BookModel,然后选择“添加”按钮。如下图。

  7. 在实体数据模型向导中,在选择模型内容页上,选择“来自数据库的 EF 设计器”,然后再选择下一步按钮。 如下图。

  8. 在“选择你的数据连接”页上执行下列步骤之一:
    • 如果下拉列表中包含到 Test 示例数据库的数据连接,请选择该连接。
    • 或者选择“新建连接”按钮来配置新数据连接。 如下图。

  9. 在“连接属性”对话框中选择对应的数据库服务器,输入用户名与密码,选择要使用的数据库。如下图。

  10. 如果数据库需要密码,请选择“是,在连接字符串中包含敏感数据”选项按钮,然后选择“下一步”按钮。 你可以观察一下下面图中的数据连接。

  11. 在“选择你的版本”页上,选择“实体框架6.x”选项按钮,然后选择“下一步”按钮。

    说明

    如果你已经按第二步中安装了具有WCF 服务的 Entity Framework 6 的最新版本,同时通过NuGet安装 WCF Data Services Entity Framework Provider 程序包,那么将不会出现此对话框,直接进入下一步。

  12. 在“选择数据库对象”页上,展开“表”节点、选中“Books”复选框,然后选择“完成”按钮。

    随即显示实体模型关系图,BookModel.edmx 文件也将添加到项目中。

  13. 最终生成的结果如下。

第五步,创建数据服务

  1. 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”、“添加新项”。
  2. 在“添加新项”对话框中,选择“Web”节点,然后选择“WCF 服务”项。
  3. 在“名称”文本框中,输入 BookService,然后选择“添加”按钮。如下图。

  4. Visual Studio 2015会同时添加一个IBookService接口文件。这个接口代码文件中的代码如下:
    [ServiceContract]
    public interface IBookService
    {
        [OperationContract]
        string GetBook(string Id);
        [OperationContract]
        string AddBook(string book);
        [OperationContract]
        string EditBook(string book);
        [OperationContract]
        string Search(string Category, string searchString);
    }
  5. 在“解决方案资源管理器中”中,定位BookService.svc.cs文件,双击在“代码编辑器”中打开,并编写如下代码。

    public class BookService : IBookService
    {
        Entities db = new Entities();
        public string AddBook(string mbook)
        {
            try
            {
                Books book = XMLHelper.DeSerializer<Books>(mbook);
                db.Books.Add(book);
                db.SaveChanges();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "true";
        }
    
        public string EditBook(string mbook)
        {
            try
            {
                Books book = XMLHelper.DeSerializer<Books>(mbook);
                db.Entry(book).State = EntityState.Modified;
                db.SaveChanges();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "true";
        }
    
        public string GetBook(string Id)
        {
            int bookId = Convert.ToInt32(Id);
            Books book = db.Books.Find(bookId);
            string xml = XMLHelper.ToXML<Books>(book);
            return xml;
        }
    
        public string Search(string Category, string searchString)
        {
            var cateLst = new List<string>();
            var cateQry = from d in db.Books
                          orderby d.Category
                          select d.Category;
            cateLst.AddRange(cateQry.Distinct());          
    
            var books = from m in db.Books
                        select m;
            if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }
    
            List<Books> list = null;
            if (string.IsNullOrEmpty(Category))
            {
                list = books.ToList<Books>();
            }
            else
            {
                list = books.Where(x => x.Category == Category).ToList<Books>();
            }
            return XMLHelper.ToXML<List<Books>>(list);
        }
    }
  6. 在菜单栏上,依次选择“调试”、“开始执行(不调试)”以运行服务。 此时将打开一个浏览窗口,并显示该服务的 XML 架构。

  7. 在地址栏中,在 BookService.svc 的 URL 末尾处输入 Books,然后按 Enter 键。如下图。

  8. 关闭浏览器窗口。

第六步,创建宿主程序

  1. WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。
  2. 在菜单栏上,依次选择“文件-->新建-->项目”,或者如下图在“解决方案资源管理器”中使用鼠标右键,弹出快捷菜单。

  3. 在“添加新项目”对话框中,展开 “Visual C#”和“Windows”节点,然后选择“控制台应用程序”模板。 在“名称”文本框中,输入 Hosting,然后选择“确定”按钮。 如下图。

  4. 我们可以通过代码的方式完成所有的服务寄宿工作。在“解决方案资源管理器中”中,定位到Program.cs文件,双击在“代码编辑器”中打开,并编写如下代码。下面的代码通过一个控制台应用对 BookService的寄宿的实现。关于配置方式参见前一文章。
using SCF.WcfService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;

namespace Hosting
{
    class Program
    {
        // 无配置文件的启动程序
        static void Main(string[] args)
        {
           using (ServiceHost host = new ServiceHost(typeof(BookService)))
            {
                host.AddServiceEndpoint(typeof(IBookService), new WSHttpBinding(), "http://127.0.0.1:8888/BookService");
                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                {
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:8888/BookService/metadata");
                    host.Description.Behaviors.Add(behavior);
                }
                host.Opened += delegate
                {
                    Console.WriteLine("BookService,按任意键终止服务!");
                };
                host.Open();
                Console.Read();
            }
        }
    }
}

在接下来的步骤中,将创建一个 Windows 窗体客户端应用程序以使用该服务。

三、创建客户端应用程序

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

在第一个步骤中,你将 Windows 窗体项目添加到解决方案中,并将其设置为启动项目。

第一步,创建客户端应用程序

  1. 在菜单栏上,依次选择“文件”、“添加”、“新建项目”。
  2. 在“添加新项目”对话框中,展开 “Visual C#”节点,选择“Windows”节点,然后选择“Windows 窗体应用程序”。
  3. 在“名称”文本框中,输入 WinClient,然后选择“确定”按钮。 如下图。

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

  5. 在菜单栏上,选择“项目”、“设为启动项目”。

第二步,添加服务引用

  1. 在菜单栏上,依次选择“项目”、“添加服务引用”。
  2. 在“添加服务引用”对话框中,将WCF服务的 URL(http://127.0.0.1:8888/BookService/metadata) 将粘贴在“地址”字段中。

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

     

  3. 选择“确定”按钮以添加服务引用。

第三步,创建用户界面

  1. 在“解决方案资源管理器”窗口中,选中“WinClient”项目,弹出右键菜单,选择“添加—》新建项”。如下图。

  2. 在“Windows Forms”节点下,选择“Windows窗体”,新建一个FrmBook.cs文件。如下图。

  3. 在FrmBook窗体界面中按下图,进行拖放窗体控件。如下图。

  4. 在解决方案资源管理器中,选中 FrmBook.cs文件,在弹出菜单中,选择“查看代码”以打开代码编辑器,将以下代码添加到 btnSearch_Click 事件处理程序中:

    private void btnSearch_Click(object sender, EventArgs e)
    {
        BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
        textBoxMsg.Text = bookSvrClient.Search(string.Empty, string.Empty);
        List<Books> books= XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text);
        gridBooks.DataSource = books;
    }
  5. 在菜单栏上,依次选择“调试”和“启动调试”以运行应用程序。在应用程序启动之后,使用鼠标点击“查询书籍”按钮, 此时将显示书籍信息。 如下图。

     

        现在,你有了一个可以使用的应用程序,该应用程序将显示 BookService服务中的书籍列表。 如果希望通过该服务公开其他数据,则可以修改实体数据模型以包括数据库中的其他表。

        在下一个可选步骤中,将学习如何筛选服务返回的数据。

四、添加筛选功能

在此步骤中,将在应用程序中添加根据书籍的类型筛选书籍数据的功能。

  1. 在解决方案资源管理器中,选中“FrmBook.cs”文件,在弹出的右键菜单中选择“打开”,或者使用鼠标左键双击。
  2. 将工具箱中的 Lable 控件、TextBox控件和 Button 控件添加到窗体。 其中在Label中填上“类型”,Button的中填上“查询”。
  3. 打开 Button 控件的快捷菜单,选择“查看代码”,然后在 btnSearchCategory_Click事件处理程序中添加以下代码:

    private void btnSearchCategory_Click(object sender, EventArgs e)
    {
        BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
        textBoxMsg.Text = bookSvrClient.Search(txtCategory.Text, string.Empty);
        List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text);
        gridBooks.DataSource = books;
    }
  4. 在菜单栏上,依次选择“调试”和“启动调试”以运行应用程序。

  5. 在红框中的文本框中,输入 IBM,然后使用鼠标点击“查询”按钮。 将仅显示来自 类型为IBM 的书籍。如下图。

  6. FrmBook.cs的全部代码见下面。

    using SCF.Contracts;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using SCF.Model;
    using SCF.Common; 
    
    namespace WinClient
    {
        public partial class FrmBook : Form
        {
            public FrmBook()
            {
                InitializeComponent();
            }
    
            private void btnGetBook_Click(object sender, EventArgs e)
            {
                Books book = new Books();
                BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
                if (gridBooks.SelectedRows.Count > 0)
                {
    
                    book = gridBooks.SelectedRows[0].DataBoundItem as Books;
                    textBoxMsg.Text = bookSvrClient.GetBook(book.BookID.ToString());
                    book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text);
                    txtBookId.Text = book.BookID.ToString();
                    txtAuthorID.Text = book.AuthorID.ToString();
                    textBoxName.Text = book.Name;
                    textBoxCategory.Text = book.Category.ToString();
                    textBoxPrice.Text = book.Price.ToString();
                }
                else
                {
                    textBoxMsg.Text = "没有选中相应的记录!";
                }
            }
    
            /// <summary>
            /// ChannelFactory方式,直接在代码中写配置信息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void buttonChannelFactory_Click(object sender, EventArgs e)
            {
                using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>(new WSHttpBinding(), "http://127.0.0.1:8888/BookService"))
                {
                    IBookService proxy = channelFactory.CreateChannel();
                    using (proxy as IDisposable)
                    {
                        textBoxMsg.Text = proxy.GetBook("4");
                        Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text);
                        txtBookId.Text = book.BookID.ToString();
                        txtAuthorID.Text = book.AuthorID.ToString();
                        textBoxName.Text = book.Name;
                        textBoxCategory.Text = book.Category.ToString();
                        textBoxPrice.Text = book.Price.ToString();
                    }
                }
            }
    
            /// <summary>
            /// ChannelFactory配置方式,在配置文件中写配置信息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void buttonChannelConfig_Click(object sender, EventArgs e)
            {
                using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService"))
                {
                    IBookService proxy = channelFactory.CreateChannel();
                    using (proxy as IDisposable)
                    {
                        textBoxMsg.Text = proxy.GetBook("5");
                        Books book = XMLHelper.DeSerializer<Books>(textBoxMsg.Text);
                        txtBookId.Text = book.BookID.ToString();
                        txtAuthorID.Text = book.AuthorID.ToString();
                        textBoxName.Text = book.Name;
                        textBoxCategory.Text = book.Category.ToString();
                        textBoxPrice.Text = book.Price.ToString();
                    }
                }
            }
    
            private void btnSearch_Click(object sender, EventArgs e)
            {
                BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
                textBoxMsg.Text = bookSvrClient.Search(string.Empty, string.Empty);
                List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text);
                gridBooks.DataSource = books;
            }
    
            private void btnSearchCategory_Click(object sender, EventArgs e)
            {
                BookServiceRef.BookServiceClient bookSvrClient = new BookServiceRef.BookServiceClient();
                textBoxMsg.Text = bookSvrClient.Search(txtCategory.Text, string.Empty);
                List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text);
                gridBooks.DataSource = books;
            }
        }
    }

标签:string,示例,Text,System,new,第二个,book,WCF,using
From: https://www.cnblogs.com/storm12/p/16992439.html

相关文章

  • WCF学习-第一个示例
        最近需要用到WCF,所以对WCF进行了解。在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例。    本文的WCF服务应用功能很简单,却涵盖了一......
  • WCF学习-概述
    一、WCF概述1)什么是WCF?    WindowsCommunicationFoundation(WCF)是用于构建面向服务的应用程序的框架。借助WCF,可以将数据作为异步消息从一个服务终结点发......
  • grep 命令示例
    grep命令目前是查看日志使用最高频的一个命令,不过它的有些参数容易忘记,这里补几个示例,供日后查看。参考:https://www.gnu.org/software/grep/manual/grep.htmlhttps://ww......
  • HTTP工作原理、请求方法、请求/响应步骤、Request/Response示例
    HTTP简单介绍HTTP是超文本传输协议,定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的。当我们没有......
  • golang实现tcp自动重连示例程序
    参考代码:packagemainimport("fmt""net""time")funcdoTask(){time.Sleep(1*time.Second)main()}funcmain(){for{conn,err......
  • 短网址解析长网址python示例
    做可视化比较麻烦我就没做,用文件处理的,这里需要两个文件1、readUrl.txt文件保存需要解析的字符串2、newUrl.txt文件保存解析完成的字符串目录​​readUrl.txt文件示例​​​......
  • C# Socket 使用简单测试示例
    引用Newtonsoft.Json.dllusingNewtonsoft.Json;进行对象序列化和反序列化。服务端:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSyst......
  • 【C语言】回调函数、嵌套函数的使用、qsort函数、qsort函数声明、qsort代码示例。
     ......
  • 隐藏人名的第二个字
      问题:将人名的第二个字改成*函数公式解决:=REPLACE(A1,2,1,"*") ......
  • 使用PyTorch进行知识蒸馏的代码示例
    随着机器学习模型的复杂性和能力不断增加。提高大型复杂模型在小数据集性能的一种有效技术是知识蒸馏,它包括训练一个更小、更有效的模型来模仿一个更大的“教师”模型的行......