使用Winform程序作为WCF服务的宿主
如果我们自己新建一个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的事件里添加如下代码:
- 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");
- }
- }
- }
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");
} } }
注意本句:
- 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). 在窗口关闭的事件里添加如下代码:
- if (Host != null)
- {
- Host.Close();
- }
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事件中填写如下代码:
- private void button1_Click(object sender, EventArgs e)
- {
- using (ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client())
- {
- sc.Open();
- MessageBox.Show(sc.GetData(10));
- sc.Close();
- }
- }
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服务的宿主的更多相关文章
- 添加宿主为控制台应用程序的WCF服务
1.创建WCF服务库:WcfServiceLibrary,根据自动创建的代码修改自己的WCF 服务协议.操作协议.数据协议.本次先实现简单的WCF最基本的通信方式:请求->应答模式. 定义服务. ...
- WCF系列教程之WCF服务宿主与WCF服务部署
本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...
- WCF学习之旅—WCF服务部署到应用程序(十)
上接 WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...
- 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- WCF服务三:svc文件详解
在前面的文章中讲述过WCF服务的宿主程序主要包括:三种,在那篇文章中,简单的描述了如何把一个WCF服务寄宿到IIS上面,这篇文章中将具体讲述如何把一个WCF服务寄宿到IIS上面. 一.新建一个WCF服 ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- WCF服务创建与使用(双工模式)
昨天发布了<WCF服务创建与使用(请求应答模式)>,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下. 第一步,定义服务契约(Service Contract),注意Se ...
- WCF学习笔记(2)——使用IIS承载WCF服务
通过前面的笔记我们知道WCF服务是不能独立存在,必须“寄宿”于其他的应用程序中,承载WCF服务的应用程序我们称之为“宿主”.WCF的多种可选宿主,其中比较常见的就是承载于IIS服务中,在这里我们来学习 ...
- 从Web Service和Remoting Service引出WCF服务
本篇先通过Web Service和Remoting Service创建服务,抛砖引玉,再体验WCF服务.首先一些基本面: 什么是WCF? Windows Communication Foundatio ...
随机推荐
- MFC函数—CWinApp::LoadStdProfileSettings
从 InitInstance 成员函数内调用该函数,启用和加载最近使用的(MRU)文件和最后浏览状态的列表.void LoadStdProfileSettings( UINT nMaxMRU = ...
- SQL Server T—SQL 学生选课数据库SQL语句考试题(45道题)
题目 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- Spring MVC 不能正常获取参数的值
最近在开发时遇到一个非常奇怪的问题,在tomcat8中使用Spring MVC框架,在Controller中的方法参数无法正常获取到相应的值,将tomcat版本换成7.0就解决了. 记录以下解决过程, ...
- 如何解决WEB应用中文乱码问题
最容易出现乱码的场景是浏览器向服务器发送请求的过程,解决的策略就是强制为请求和响应设置编码格式. 一.POST 方式请求乱码 1. 在每个 Controller 中单独处理 request.setCh ...
- JAVA动态代理基础
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) 彻底理解JAVA动态代理 class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中. ...
- <Android 基础(三十五)> RecyclerView多类型Item的正确实现姿势
简介 RecyclerView是我们开发过程中经常使用到的一个元素,原生的RecyclerView.Adapter基本上可以满足一般的需求,关于RecyclerView的基础介绍请移步: Recycl ...
- Android网络编程系列之HTTP协议原理总结
前言 作为搞移动开发的我们,免不了与网络交互打交道.虽然市面上很多开源库都封装的比较到位,我们实现网络访问也轻车熟路.但还是十分有必要简要了解一下其中的原理,以便做到得心应手,也是通往高级开发工程师甚 ...
- word2vec前世今生
word2vec前世今生 2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地 ...
- 使用GitHub-Pages创建博客和图片上传问题解决
title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...