如果我们自己新建一个WCF服务库,生成了dll文件。那我们需要创建一个宿主程序,在本例中我们新建一个Winform程序作为WCF的宿主程序。

在网上很多教程里对创建过程写的很模糊,错误也很多。本文是作者在尝试了网上各种失败方法之后,经过自己的改正,总结出的可以正确运行的解决方案。

1. 创建wcf服务库。

打开vs, 新建一个 WCF服务库。 什么都不用改,直接生成。 此时会在bin目录下生成一个dll文件(默认名WcfServiceLibrary1.dll)。

2. 创建宿主程序。

1). 打开vs,新建一个Windows窗体应用程序。

2). 添加引用,System.ServiceModel和 刚刚生成的WcfServiceLibrary1.dll。

3). 创建一个button,在button.click的事件里添加如下代码:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. if (Host == null)
  4. {
  5. Host = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
  6. System.ServiceModel.Channels.Binding httpbinding = new BasicHttpBinding();
  7. Host.AddServiceEndpoint(typeof(WcfServiceLibrary1.Service1), httpbinding, "http://localhost:8002");
  8. if (Host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
  9. {
  10. ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  11. behavior.HttpGetEnabled = true;
  12. behavior.HttpGetUrl = new Uri("http://localhost:8002/Service1");
  13. Host.Description.Behaviors.Add(behavior);
  14. Host.Open();
  15. MessageBox.Show("OK");
  16. }
  17. }
  18. }
        private void button1_Click(object sender, EventArgs e)
{
if (Host == null)
{
Host = new ServiceHost(typeof(WcfServiceLibrary1.Service1)); System.ServiceModel.Channels.Binding httpbinding = new BasicHttpBinding(); Host.AddServiceEndpoint(typeof(WcfServiceLibrary1.Service1), httpbinding, "http://localhost:8002");
if (Host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://localhost:8002/Service1");
Host.Description.Behaviors.Add(behavior); Host.Open(); MessageBox.Show("OK");
} } }

注意本句:

  1. Host.AddServiceEndpoint(typeof(WcfServiceLibrary1.IService1), httpbinding, "http://localhost:8002");
Host.AddServiceEndpoint(typeof(WcfServiceLibrary1.IService1), httpbinding, "http://localhost:8002");

.IService1 为网络教程中出错经作者修改的部分,此处如果写成Service1的话会报如下的错:

协定类型WcfServiceLibrary1.Service1不具有ServiceContractAttribute特性。若要定义有效协定(协定接口或服务类)必须具有ServiceContractAttribute特性。

4). 在窗口关闭的事件里添加如下代码:

  1. if (Host != null)
  2. {
  3. Host.Close();
  4. }
if (Host != null)
{
Host.Close();
}

5). 生成,运行。

3.  创建客户端程序。

1). 打开vs,新建一个Windows窗体应用程序。

2). 右键点击引用,然后选择添加服务引用,在地址栏中输入 http://localhost:8002/Service1 ,即刚刚代码中的behavior的uri,注意不是http://localhost:8002/。

3). 点击前往,然后点确定即可。

注意:在网上的好些教程里都写的是在宿主程序用用WCF配置工具生成app.config然后运行宿主程序,那样生成的app.config是有问题的,在客户端程序引用的时候会报错。错误提示:

下载“http://localhost:8082/wcf2”时出错。 请求因 HTTP 状态 400 失败: Bad Request。 元数据包含无法解析的引用:“http://localhost:8082/wcf2”。 服务 http://localhost:8082/wcf2 不支持内容类型 application/soap+xml; charset=utf-8。客户端和服务绑定可能不匹配。 远程服务器返回错误: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.。 如果该服务已在当前解决方案中定义,请尝试生成该解决方案,然后再次添加服务引用。

此问题绝对会发生,但那些教程里并没有指出错误并告知解决办法。困扰我许久之后我终于发现本文中的方法。

4). 创建一个button,button的click事件中填写如下代码:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. using (ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client())
  4. {
  5. sc.Open();
  6. MessageBox.Show(sc.GetData(10));
  7. sc.Close();
  8. }
  9. }
        private void button1_Click(object sender, EventArgs e)
{
using (ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client())
{
sc.Open();
MessageBox.Show(sc.GetData(10));
sc.Close();
}
}

5).生成,运行即可。

使用Winform程序作为WCF服务的宿主的更多相关文章

  1. 添加宿主为控制台应用程序的WCF服务

    1.创建WCF服务库:WcfServiceLibrary,根据自动创建的代码修改自己的WCF 服务协议.操作协议.数据协议.本次先实现简单的WCF最基本的通信方式:请求->应答模式. 定义服务. ...

  2. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  3. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  4. 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  5. WCF服务三:svc文件详解

    在前面的文章中讲述过WCF服务的宿主程序主要包括:三种,在那篇文章中,简单的描述了如何把一个WCF服务寄宿到IIS上面,这篇文章中将具体讲述如何把一个WCF服务寄宿到IIS上面. 一.新建一个WCF服 ...

  6. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  7. WCF服务创建与使用(双工模式)

    昨天发布了<WCF服务创建与使用(请求应答模式)>,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下. 第一步,定义服务契约(Service Contract),注意Se ...

  8. WCF学习笔记(2)——使用IIS承载WCF服务

    通过前面的笔记我们知道WCF服务是不能独立存在,必须“寄宿”于其他的应用程序中,承载WCF服务的应用程序我们称之为“宿主”.WCF的多种可选宿主,其中比较常见的就是承载于IIS服务中,在这里我们来学习 ...

  9. 从Web Service和Remoting Service引出WCF服务

    本篇先通过Web Service和Remoting Service创建服务,抛砖引玉,再体验WCF服务.首先一些基本面: 什么是WCF? Windows Communication Foundatio ...

随机推荐

  1. SQL Server无法打开物理文件,操作系统错误 5:"5(拒绝访问。)的解决办法

    在新装的系统中使用SQL Server附加以前的数据库的时候可能会遇到“无法打开物理文件,拒绝访问”的错误,如下图: 解决方法为使用windows验证登录,或者更改SQL Server内置账户类型为L ...

  2. [日常] Linux下的docker实践

    1.Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC) 2.Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离 3.Docker 属 ...

  3. Java - HashCode源码解析

    Java提高篇(二六)-----hashCode hashCode的作用 要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用.在讲解数组时(java提高篇(十八)----- ...

  4. gradle tool升级到3.0注意事项

    Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...

  5. vuex 管理vue-router的传值

    假设有这样的一种情况,在两个组件中.一个组件[A]主要是比如说放表格数据,而另外一个组件[B]是专门用来向组件A的表格添加数据的表单.这个时候就是两个兄弟组件之间传递数据了.首先想到的是使用兄弟组件传 ...

  6. NUnit单元测试示例

    单元测试的用法 1.下载NUnit软件 安装后打开界面如图: 2.新建测试项目 添加类库项目并在NuGet管理包中添加NUnit 这里添加NuGet的NUnit包要注意保持版本和之前下载的NUnit软 ...

  7. 微信小程序< 2 > ~ 微信小程序之头条新闻

    简介 上一篇文章,主要是介绍下微信小程序的开发环境安装和微信组件什么的一些基础的开发内容,所以最近一直在业余找练手的机会.由于之前没有接触过JS,自己学习起来还算是比较的吃力,一点一点的来吧!要持久. ...

  8. 搭建ReactNative时的最普遍的错误—— ":CFBundleIdentifier", Does Not Exist

    报错 ":CFBundleIdentifier", Does Not Exist 今天搭建Reactnative 报错 注意当你第一次搭建RN时,包体下载的都是最新的版本,由于现在 ...

  9. Python学习笔记之—— File(文件) 对象常用函数

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...

  10. IE浏览器“自定义安全级别”不能设置的原因

    “自定义安全级别”和滑块都是灰色,不允许设置.可能的原因: 1.组策略里面设置了: 2.启用了IE增强的安全设置: 程序卸载->选择windows组件->取消增强的安全设置