WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七)
WCF学习之旅—第三个示例之二(二十八)
在上一篇文章中我们创建了WCF服务端应用程序,在这一篇文章中我们来学习如何创建WCF的服务端寄宿程序与客户端调用程序。
关于如何寄宿可以参考以下文章WCF学习之旅—WCF寄宿前的准备(八), WCF学习之旅—WCF服务部署到IIS7.5(九),WCF学习之旅—WCF服务部署到应用程序(十),WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一),WCF学习之旅—WCF服务的WAS寄宿(十二),WCF学习之旅—WCF服务的批量寄宿(十三)
具体步骤见下面。
七、创建WCF服务端寄宿程序
- WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。
- 我们在BookMgr.Hosting项目中通过配置方式完成所有的服务寄宿工作,下面的代码是通过一个控制台应用对 BookService的寄宿的实现。关于配置方式参见前一文章。
- 如果在运行的过程中会出现以下错误信息:“在服务“BookService”实现的协定列表中找不到协定名称“BookMgr.Contracts.IBookService”。则回到BookMgr.Contracts项目中修改接口文件代码如下。
using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; namespace BookMgr.Contracts { [ServiceContract] public interface IBookService { [OperationContract] string Add(string bookInfo); [OperationContract] string Edit(string bookInfo); [OperationContract] string Get(string bookId); [OperationContract] string Delete(string bookInfo); [OperationContract] string Search(string Category, string searchString); } }
4. BookMgr.Hosting 中的App.config配置文件如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework,
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add name="BookEntities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=Test;
integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" logKnownPii="false" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /> <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" /> </diagnostics> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8088/BookService/metadata" /> <serviceDebug includeExceptionDetailInFaults="True" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="metadataBehavior" name="BookMgr.Service.BookService"> <endpoint address="http://127.0.0.1:8088/BookService" binding="wsHttpBinding" contract="BookMgr.Contracts.IBookService" /> </service> </services> </system.serviceModel> </configuration>
5. BookMgr.Hosting中的Program.cs的代码如下:
using BookMgr.Service; using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.ServiceModel.Description; using System.Text; using System.Threading.Tasks; namespace BookMgr.Hosting { class Program { static void Main(string[] args) { try { using (ServiceHost host = new ServiceHost(typeof(BookService))) { host.Opened += delegate { Console.WriteLine("BookService,使用配置文件,按任意键终止服务!"); }; host.Open(); Console.ForegroundColor = ConsoleColor.Yellow; foreach (ServiceEndpoint se in host.Description.Endpoints) { Console.WriteLine("[终结点]: {0}\r\n\t[A-地址]: {1} \r\n\t [B-绑定]: {2} \r\n\t [C-协定]: {3}", se.Name, se.Address, se.Binding.Name, se.Contract.Name); } Console.Read(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
在接下来的步骤中,将创建一个 Windows 窗体客户端应用程序以使用该服务。
八、创建客户端Windows应用程序
- 在菜单栏上,依次选择“文件-->添加-->新建项目”。
- 在“添加新项目”对话框中,展开 “Visual C#”节点,选择“Windows”节点,然后选择“Windows 窗体应用程序”。
- 在“名称”文本框中,输入 BookMgr.Client,然后选择“确定”按钮。 如下图。
4. 在解决方案资源管理器中,添加一些引用,如下图。 5. 在菜单栏上,选择“项目”、“设为启动项目”。
6. 在“解决方案资源管理器”窗口中,选中“BookMgr.Client”项目,弹出右键菜单,选择“添加—》新建项”。 7. 在“Windows Forms”节点下,选择“Windows窗体”,新建一个FrmBook.cs文件。如下图。
8. 在FrmBook窗体界面中按下图,进行拖放窗体控件。
九、添加筛选功能
在此步骤中,将在应用程序中添加根据书籍的类型筛选书籍数据的功能。
- 在解决方案资源管理器中,选中“FrmBook.cs”文件,在弹出的右键菜单中选择“打开”,或者使用鼠标左键双击。
- 将工具箱中的 Lable 控件、TextBox控件和 Button 控件添加到窗体。
- 打开 Button 控件的快捷菜单,选择“查看代码”,然后在 btnSearchCategory_Click事件处理程序中添加以下代码:
private void btnSearchCategory_Click(object sender, EventArgs e) { try { using (ChannelFactory<IBookService> channelFactory = new ChannelFactory<IBookService>("WSHttpBinding_IBookService")) { IBookService proxy = channelFactory.CreateChannel(); using (proxy as IDisposable) { textBoxMsg.Text = proxy.Search(txtCategory.Text, string.Empty); List<Books> books = XMLHelper.DeSerializer<List<Books>>(textBoxMsg.Text); gridBooks.DataSource = books; } } } catch (Exception ex) { textBoxMsg.Text = ex.Message; } }
4. 在菜单栏上,依次选择“调试”和“启动调试”以运行应用程序。
5. 在红框中的文本框中,输入 IBM,然后使用鼠标点击“查询”按钮。 将仅显示来自 类型为IBM 的书籍。如下图。
现在,你有了一个可以使用的应用程序,该应用程序将显示 BookService服务中的书籍列表。 如果希望通过该服务公开其他数据,则可以修改实体数据模型以包括数据库中的其他表。
注:如果在进行这一步骤中的编码过程中,出现了以下异常错误信息:
错误信息:
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
光看上面的错误信息无法判断到底是怎么回事,进行调试,查看WCF内部暴露的错误信息,如下
无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
这个异常,最后我找到出错的原因是:由于BookMgr.Hosting项目缺少对EntityFramework.SqlServer.dll的引用。
解决方法:为BookMgr.Hosting项目通过nuget添加上EntityFramework包,如下图一。原来的引用图如下图二,添加引用之后,如下图三。
图1
图2
图3
相关文章
- 【FAQ】分析服务导出的事件数据和概览页面展示的数据不一致该如何解决?
- 金融App面临安全风险?解锁HMS Core安全检测服务解决方案
- CodeArts TestPlan:一站式测试管理平台
- cookie、session,、token,还在傻傻分不清?
- 一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup
- 高并发环境下构建缓存服务,你需要注意这6点
- 一文详解RocketMQ的存储模型
- Serverless时代的微服务开发指南:华为云提出七大实践新标准
- 用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源
- CSV:简单格式下隐藏的那些坑
- 能将三次握手讲到这个程度,不给你offer给谁!
- 细数华为云云原生产品及五大开源实践
- 解密秒杀系统架构:不是所有的秒杀都是秒杀
- 《迷你世界》亿级玩家都在用的游戏场景推荐系统长啥样?
- ROMA Connect: 5大联接能力+4大集成能力,推进企业数字化转型
- DTT年度收官圆桌π,华为云8位技术专家的年末盘点
- 工业数据分析为什么要用FusionInsight MRS IoTDB?
- 云网络运维必备神器:全链路故障诊断与分析
- 掌握这5大功能,解锁鲲鹏开发新发现
- 华为云助推武水集团项目成功入选住建部“智慧水务”典型案例!