WCF 程序入门
WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型,是建立在消息通信这一概念基础上运行的一个运行时服务系统。
WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务端和WCF客户端。该编程模型封装在.NET框架的System.SericeModel命名空间中。
利用WCF,开发人员不再根据不同的需求分别选择不同的模型,而是只用一种模型,就可以用统一的格式和用法编写各种网络应用程序,从而构建安全的,可靠的,跨平台(包括Windows平台和非Windows平台)的分布式解决方案。
一 WCF示例
1 创建服务端项目和客户端项目
一般为了方便调试和观察,一般在同一个解决方案中既包括WCF服务端应用程序项目,也包括客户端应用程序项目。但是,在实际的项目开发中,由于用【WCF服务应用程序】模板创建的服务是通过IIS单独部署的,所以应分别用不同的解决方案来实现。
(1)选择【WPF应用程序】模板,新建一个客户端应用程序项目。解决方案名WcfServiceTest,项目名为Client。
(2)创建服务端
在【解决方案管理器】中,右键单击解决方案名,选择【添加】-->【新建项目】,在弹出的窗口中选择【WCF服务应用程序】模板,单击【确定】,此时系统会自动添加对System.ServiceModel命名空间的引用,并自动在该项目中生成一下文件。
- IService.cs:用接口定义服务协定和数据协定
- Service.svc和Service.svc.cs:实现IService1接口中声明的服务操作
- Web.config:服务器端配合文件,用于定义服务行为以及绑定的协议等
(3)添加新服务(可选)
如果不希望使用默认的WCF服务Service1,可以利用【重构】将其替换成其他名称,或者删除IService.cs,IService.svc,IService.svc.cs,然后按照下面的方法创建或添加新服务。右击项目名,选择【添加】-->【WCF服务】命令,在弹出的窗口中将【项名称】改为新的WCF服务名称,单击【确定】按钮。
2 编写服务端代码
此部分的主要工作就是设计和实现协定,包括服务协定,数据协定以及消息协定。
服务协定用ServiceContract特性来声明,用接口来定义。在借口内部,用方法及其参数声明服务提供的操作,在接口中声明的这些方法统称为“操作方法”。注意在服务协定中只能声明操作方法,不允许声明属性和字段。
(1)定义接口(IService.cs)
[ServiceContract]
public interface IService1
{
// TODO: 在此添加您的服务操作 [OperationContract] string SayHello(string name);
[OperationContract] double Add(double d1, double d2);
[OperationContract] double Divide(double d1, double d2);
}
(2)实现接口声明的操作方法(Service.svc.cs)
public class Service1 : IService1
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
} public double Add(double d1, double d2)
{
return d1 + d2;
} public double Divide(double d1, double d2)
{
return d1 / d2;
}
}
代码编写完毕后,右键单击WcfService项目名,选择【生成】或【重新生成】,以确保没有语法错误。
3 修改服务端配置
(1)修改绑定配置(Web.config)文件,找到protocolMapping配置节,在其上方添加以下代码:
<bindings>
<basicHttpBinding>
<binding name ="b1" transferMode ="Buffered" textEncoding="utf-8" messageEncoding ="Text">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
将protocolMapping配置节的代码改为一下内容:
<protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>
在protocolMapping配置节的下方添加以下代码:
<services>
<service name="WcfService1.Service1">
<endpoint binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService1.IService1" />
</service>
</services>
(2)开通调试功能
在Web.config中找到includeExceptionDetailInFaults,将其改为true。
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="true"/>
4 测试服务(可选)
用【WCF应用程序】模板创建WCF服务后,如果需要,可以直接利用【WCF测试客户端】来测试每个服务操作。
右击WcfService文件名,选择【设为启动项目】命令,并选中要测试的Service.svc文件名(测试那个服务就选中哪个.svc文件),然后按<F5>调试运行,此时系统会自动弹出WCF测试客户端。
测试结束后,要再将WPF应用程序设为启动项目。
5 在服务端添加引用
(1)确保服务已经启动
单击WcfService项目,选择【生成】或【重新生成】,若WCF服务没有启动,则会失败。
(2)查找引用的服务
单击Client项目中的【引用】-->【添加服务引用】,在弹出的对话框中,单击【发现】,此时会自动找到与该项目在同一个解决方案中俄的WCF服务
(3)生成客户端代码
using Client.ServiceReference1;
private void btn1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "客户端调用sayhello方法,服务端返回:\n";
//创建服务客户端
Service1Client client = new Service1Client();
//调用服务
string s = client.SayHello("欢迎学习WCF!");
//关闭服务客户端并清理资源
client.Close();
textBlock1.Text += s;
}
WCF 程序入门的更多相关文章
- WCF分分钟入门
近来学习wcf,总结了一下入门的经验,小白的入门篇,也方便以后复习,省的去查质料. 第一步:创建wcf程序,程序初始化有一个接口和一个实现类写个简单的返回方法就可以了: 第二步:创建一个宿主,也就是服 ...
- C#面向服务编程技术WCF从入门到实战演练
一.WCF课程介绍 1.1.Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的.不能哪一个技术框架和行业标准作 ...
- 天河微信小程序入门《四》:融会贯通,form表单提交数据库
天河在阔别了十几天之后终于又回来了.其实这篇文章里的demo是接着(天河微信小程序入门<三>)后面就做了的,但是因为最近在做别的项目,所以就偷懒没有发出来.放到今天来看,从前台提交数据到数 ...
- 天河微信小程序入门《三》:打通任督二脉,前后台互通
原文链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=505&extra=page%3D1 天河君在申请到https ...
- 天河微信小程序入门:阿里云tomcat免费配置https
天河君在第一时间通过了微信小程序验证,开启了我的微信小程序之旅.因为天河君之前是一名后端狗,对前端不是很了解,所以几乎可以认为是从零开始学做微信小程序.也希望有志在微信小程序方向做点事情的朋友能够和我 ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
- 微信小程序入门正确姿势(一)
[未经作者本人同意,请勿以任何形式转载] >>>前言 这是 [认真学编程] 系列的 第4篇 文章(微信小程序入门系列),欢迎点赞分享.写留言,这些都是对我最好的支持. 本系列适合有一 ...
- WCF初探-2:手动实现WCF程序
1.前言 上一篇,我们通过VS自带的模板引擎自动生成了一个wcf程序,接下来我们将手动实现一个wcf程序.由于应用程序开发中一般都会涉及到大量的增删改查业务,所以这个程序将简单演示如何在wcf中构建简 ...
- 汇编语言程序入门实验一:在dos下对用户输入作出应答
汇编语言程序入门实验一:在dos下对用户输入作出应答 1,背景 成功预言了今天要上计算机操作系统上机实验课,昨天预习后,今天的两个上机实验做得很成功.但是也有一些问题.问题1:学校的系统目前是wind ...
随机推荐
- Git 常用命令详解
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
- Centos7无法上网
详情参照步骤:http://www.cnblogs.com/yxyht/p/5063505.html
- jQuery获取输入框并设置焦点
$(':input:enabled:visible:first').focus(); $("input:text:visible:first").focus(); 表单元素选择器: ...
- POJ 2718 Smallest Difference【DFS】
题意: 就是说给你一些数,然后要求你使用这些数字组成2个数,然后求他们的差值最小. 思路: 我用的双重DFS做的,速度还比较快,其中有一个很重要的剪枝,若当前搜索的第二个数后面全部补零与第一个数所产生 ...
- 2 Unique Binary Search Trees II_Leetcode
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- #英文#品读中国城市个性——最好的和最坏的&当东方遇到西方
冒险家的乐园 a playground of risk 实现发财梦 realize one's dreams of wealth 道德沦丧,堕落 moral deprivation 租界 foreig ...
- Vmware无法获取快照信息 锁定文件失败
今天早上起来发现虚拟机崩了: 造成原因: 如果使用VMWare虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动, 会提示:锁定文件失败,打不开磁盘或快照所依赖的磁盘: 这是因为虚拟机在运行的时候 ...
- Qt实现端口扫描器
首先展示一下效果: 界面通过Qt设计师做出来的. 主要有两个类. 首先主函数: #include "mainwindow.h" #include <QApplication& ...
- hibernate框架int和Integer类型区别
hibernate 框架在定义实体时,int类型最好定义为Inttger类型,因为在注入时int是值类型不允许为空.
- URAL 2089 Experienced coach Twosat
Description Misha trains several ACM teams at the university. He is an experienced coach, and he doe ...