了解WCF的前世今生之实现服务端(一)
http://www.cnblogs.com/jiagoushi/archive/2013/03/15/2962351.html
1.WCF是对现有的分布式通信技术的一个整合,其中包括Com/DCom、.Net Remoting、Web服务及其WSE(web服务的升级版本)、MSMQ,是微软大一统的技术。
2..Net Remoting 是用于远程调用,但是不支持跨平台,也就是说通信的双方都要支持.net,其实没有实现真正意义上的面向服务。
3.web service 和WSE可以说是真正的面向服务的设计,也实现了跨平台,但是它只能基于HTTP的方式传输,而且安全性、可靠性的得不到保障,所以也达不到企业级开发的要求。
4.MSMQ 是基于Windows的消息队列,它的优点也很多,例如可以支持离线传输、断点传输等。但是只能在同一台服务器或者说是同一台电脑上传输,根本就谈不上分布式
总结:WCF是所有这些通信技术的大一统,结合了他们所有的优点,能够实现高效率、可靠性、安全性、跨平台、跨语言调用。
msdn上关于WCF说明:http://msdn.microsoft.com/zh-cn/library/vstudio/ms735119(v=vs.90).aspx
第一节 入门教程
一.学习完本章你能有什么收获?
你可以大概知道创建wcf服务和客户端应用程序所需的步骤。
二.wcf服务是什么?
服务它是一种构造,它公开一个或者多个终结点,每个终结点提供一种或多种操作。每个终结点提供下列信息:服务在哪里;一个绑定,其中包含客户端必须与服务通信的信息;一个协定,用于定义服务向客户端提供的功能。
三.接下来学习的内容:定义服务、实现服务、如何在代码中配置服务、承载服务、运行服务。
1.WCF 提供了一个 ServiceModel Metadata Utility Tool (Svcutil.exe) 来自动完成以下过程:访问发布的这些元数据,然后使用这些元数据来构造和配置服务的客户端应用程序。(有空研究下这个工具)
3.1 如何:定义 Windows Communication Foundation 服务协定
创建基本 WCF 服务时,第一项任务是定义协定。协定指定服务支持的操作。可以将操作视为一个 Web 服务方法。通过定义 C++、C# 或 VB 接口可创建协定。接口中的每个方法都对应于特定的服务操作。每个接口都必须将 ServiceContractAttribute 应用于自身,而每个操作都必须将OperationContractAttribute 应用于自身。如果接口中的一个方法具有 ServiceContractAttribute 而没有 OperationContractAttribute,则不公开该方法。
通过在“开始”菜单中右击“Visual Studio 2008”并选择“以管理员身份运行”,以管理员身份打开该程序。
创建新的控制台应用程序项目。在“新建项目”对话框中,选中“Visual Basic”或“Visual C#”,并选择“控制台应用程序”模板,并命名为Service。使用默认的位置。
将默认的 Service 命名空间更改为 Microsoft.ServiceModel.Samples。
将对 System.ServiceModel.dll 的引用添加到项目。
- 在“解决方案资源管理器”中,右击项目文件夹下的“引用”文件夹,然后选择“添加引用”。
- 单击“添加引用”对话框中的“浏览”选项卡,导航到“c:\Windows\Microsoft.Net\Framework\v3.0\Windows Communication Foundation”,选择“System.ServiceModel.dll”,然后单击“确定”。
注意:
在使用命令行编译器(例如 Csc.exe 或 Vbc.exe)时,还必须提供程序集的路径。例如,在运行 Windows Vista 的计算机上,默认情况下的路径为:Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation。 为 System.ServiceModel 命名空间添加一个 using 语句(在 Visual Basic 中为 Imports)。
定义一个名为 ICalculator 的新接口,并向该接口应用 Namespace 值为“http://Microsoft.ServiceModel.Samples”的ServiceContractAttribute 属性。显式指定命名空间是一种最佳做法,因为这样可防止将默认命名空间值添加到协定名称。
注意:
使用属性来批注接口或类时,可以从属性名称中去掉“Attribute”部分。因此 ServiceContractAttribute 将变成 [ServiceContract] 在接口中为 ICalculator 协定公开的每个操作(加、减、乘和除)声明一个方法,并对希望作为公共 WCF 协定的一部分公开的每个方法应用 OperationContractAttribute 属性
总结:定义服务其实就是将ServiceContract 和 OperationContract 分别应用于接口和方法(不应用则不公开方法)的动作。
3.2 如何:实现 服务协定
在定义了 ICalculator 接口的同一文件中创建一个名为 CalculatorService 的新类。CalculatorService 实现 ICalculator 接口。
在 CalculatorService 类中实现在 ICalculator 接口中定义的每个方法。
总结:实现的话就是声明一个类,继承接口然后实现接口里面的方法
服务协定代码如下:
class Program
{
static void Main(string[] args)
{
//创建一个ServiceHost
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
{
// Open the ServiceHost to create listeners
serviceHost.Open();
Console.WriteLine("服务已经开启!");
Console.WriteLine("按回车键结束服务!");
Console.WriteLine();
Console.ReadLine();
}
} }
[ServiceContract(Namespace = "http;//Microsoft.ServiceModel.Samples")]//定义服务协定完成
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
} public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
} public double Subtract(double n1, double n2)
{
return n1 - n2;
} public double Multiply(double n1, double n2)
{
return n1 * n2;
} public double Divide(double n1, double n2)
{
return n1 / n2;
}
}
服务端配置如下:
<!--name =命名空间的加上服务的名称-->
<system.serviceModel>
<!--services >
<service name="Microsoft.ServiceModel.Samples.CalculatorService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8084/ServiceModelSamples/service"/>
</baseAddresses>
</host>
</service>
</services>-->
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="customServiceBehavior">
<host>
<baseAddresses>
<!--<add baseAddress="http://localhost:8705/Hantele.Habis.Server/ResourceService" />-->
<add baseAddress="net.tcp://localhost:8084/ServiceModelSamples/service" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfiguration" contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="customServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph=""/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfiguration" sendTimeout="00:10:00" maxBufferSize="" maxReceivedMessageSize="" portSharingEnabled="true">
<readerQuotas
maxArrayLength=""
maxBytesPerRead=""
maxDepth=""
maxNameTableCharCount=""
maxStringContentLength="" />
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
了解WCF的前世今生之实现服务端(一)的更多相关文章
- [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端
原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...
- WCF学习心得--客户端获取服务端自定义类数据
因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...
- wcf第2步之服务端标准配置文件
服务端app.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...
- WCF使用地址去调用服务端的方法
前面的章节已经讲过了WCF的代码和SVC页面的分离,这里是分离后,客户端调用代码如下: try { var myBinding = new BasicHttpBinding(); var myEndp ...
- WCF学习之旅—实现支持REST服务端应用(二十三)
在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...
- WCF备忘录一:服务端实例的生命周期
示例代码下载地址:WCFDemo1Day 概述 客户端向WCF服务发出请求后,服务端会实例化一个Service对象(实现了契约接口的对象)用来处理请求,实例化Service对象以及维护其生命周期的方式 ...
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- 使用多种客户端消费WCF RestFul服务(一)——服务端
RestFul风格的WCF既然作为跨平台.跨语言.跨技术的一种方式出现,并且在ASP.NET API流行起来之前还是架构的首选技术之一,那么我们就来简要的介绍一下WCF在各个平台客户端的操作. 开发工 ...
- WCF服务端与客户端时间匹配问题
当服务端部署的WCF服务服务在被客户机调用时,如果显示: 错误,展开后,详细错误为:An error occurred when verifying security for the message ...
随机推荐
- hdu 1014 Uniform Generator 数论
摘取于http://blog.csdn.net/kenden23/article/details/37519883: 找到规律之后本题就是水题了,不过找规律也不太容易的,证明这个规律成立更加不容易. ...
- 使用docker安装myql/redis等软件
使用docker安装myql/redis等软件 概述 基本命令 安装mysql 安装redis 概述 在开发时经常需要安装各种软件,有时甚至为了验证一个命令不得不安装配置一个缓存.数据库.MQ等,耽误 ...
- 使用rviz 查看远程主机
一.安装好ros环境 https://www.cnblogs.com/sea-stream/p/9809590.html 二.配置参数 vim ~/.bashrc #输入内容 export ROS_H ...
- net网站发布-允许更新此预编译站点 及修改发布后内容
我们可以通过如下的方法发布VS2010的网站: “生成”→“发布网站”:弹出对话框! 在打开的对话框中,有一个选项是至关重要的,那就是“允许更新此预编译站点”: “允许更新此预编译站点”这一项,默认情 ...
- VSS_01
1.设置 工作目录 右击 CSDRGis --> Set Working Folder.. --> D:\CSDRGis 2.下载 源码 右击 CSDRGis --> Get Las ...
- Codeforces 448E - Divisors
448E - Divisors 思路: dfs.注意如果是1,直接返回,因为1的因子还是1. 因为x因子的因子还是x的因子,所以可以事先处理好x因子的因子在x因子中的位置. 不用这个方法也可以,用ma ...
- Kafka特性
———————————————————————————————————————————————— [关键原理] 1.消息文件存储(消息堆积能力) 2.消息topic分区 3.消息顺序的保证 4.拉模型 ...
- 『Networkx』常用方法
这是一个用于分析'图'结构的包,由于我只是用到了浅显的可视化功能,所以这个介绍会对其使用浅尝辄止. 解决matplotlib中文字体缺失问题, from pylab import mpl mpl.rc ...
- vue新手入门指导,一篇让你学会vue技术栈,本人初学时候的文档
今天整理文档突然发现了一份md文档,打开一看 瞬间想起当年学习vue的艰难路,没人指导全靠自己蒙,下面就是md文档内容,需要的小伙伴可以打开个在线的md编译器看一看,我相信不管是新人还是老人 入门总 ...
- Chrome DevTools 的 Sources 调试
在 Chrome 中调试 JS 代码,那你不得不与 Chrome DevTools 的 Sources 面板打交道,所以文章主要通过介绍 Sources 面板上的各部分功能来介绍如何调试网页中的 JS ...