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
WCF学习之旅—第三个示例之四(三十)的更多相关文章
- WCF学习之旅—基于Fault Contract 的异常处理(十八)
WCF学习之旅—WCF中传统的异常处理(十六) WCF学习之旅—基于ServiceDebug的异常处理(十七) 三.基于Fault Contract 的异常处理 第二个示例是通过定制Servic ...
- WCF学习之旅—第三个示例之二(二十八)
上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1) 使用NuGet下载最新版的Entity Fram ...
- WCF学习之旅—第三个示例之三(二十九)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...
- WCF学习之旅—第三个示例之五(三十一)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) WCF学习 ...
- WCF学习之旅——第一个WCF示例(三)
第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...
- WCF学习之旅——第一个WCF示例(一)
最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...
- WCF学习之旅—WCF第二个示例(五)
二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...
- WCF学习之旅—WCF第二个示例(七)
三.创建客户端应用程序 若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据. 在第一个步骤中,你将 Windows 窗体项目添加到解 ...
- WCF学习之旅—WCF第二个示例(六)
第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...
随机推荐
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- 解决PHP-问题:Class 'SimpleXMLElement' not found in
1.问题 在ubuntu 16.10中,学习PHP,学习到PHP如何生成XML文件时候,碰到了这个问题: PHP Fatal error: Class 'ClassName\SimpleXMLElem ...
- Hive on Spark安装配置详解(都是坑啊)
个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/p/a7f75b868568 简介 本文主要记录如何安装配置Hive on Sp ...
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- Redis百亿级Key存储方案(转)
1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...
- windows环境redis主从安装部署
准备工作 下载windows环境redis,我下载的是2.4.5,解压,拷贝一主(master)两从(slaveof).主机端口使用6379,两从的端口分别为6380和6381, 我本地索性用6379 ...
- 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇
最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...
- sql server 取文件名函数 转载
/****** Object: UserDefinedFunction [dbo].[GetDirectoryPath] Script Date: 2016-12-16 16:54:05 ****** ...
- 针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案
近期有Linux ASP.NET用户反映,在MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404(找不到网页) ...
- DBCP 配置备注
<property name="initialSize" value="5"></property> <property name ...