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,则不公开该方法。

  1. 通过在“开始”菜单中右击“Visual Studio 2008”并选择“以管理员身份运行”,以管理员身份打开该程序。

  2. 创建新的控制台应用程序项目。在“新建项目”对话框中,选中“Visual Basic”“Visual C#”,并选择“控制台应用程序”模板,并命名为Service。使用默认的位置。

  3. 将默认的 Service 命名空间更改为 Microsoft.ServiceModel.Samples

  4. 将对 System.ServiceModel.dll 的引用添加到项目。

    1. “解决方案资源管理器”中,右击项目文件夹下的“引用”文件夹,然后选择“添加引用”
    2. 单击“添加引用”对话框中的“浏览”选项卡,导航到“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。

  5. 为 System.ServiceModel 命名空间添加一个 using 语句(在 Visual Basic 中为 Imports)。

  6. 定义一个名为 ICalculator 的新接口,并向该接口应用 Namespace 值为“http://Microsoft.ServiceModel.Samples”的ServiceContractAttribute 属性。显式指定命名空间是一种最佳做法,因为这样可防止将默认命名空间值添加到协定名称。

    注意:
    使用属性来批注接口或类时,可以从属性名称中去掉“Attribute”部分。因此 ServiceContractAttribute 将变成 [ServiceContract]

  7. 在接口中为 ICalculator 协定公开的每个操作(加、减、乘和除)声明一个方法,并对希望作为公共 WCF 协定的一部分公开的每个方法应用 OperationContractAttribute 属性

总结:定义服务其实就是将ServiceContract 和 OperationContract 分别应用于接口和方法(不应用则不公开方法)的动作。

3.2 如何:实现 服务协定

  1. 在定义了 ICalculator 接口的同一文件中创建一个名为 CalculatorService 的新类。CalculatorService 实现 ICalculator 接口。

  2. 在 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的前世今生之实现服务端(一)的更多相关文章

  1. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

  2. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  3. wcf第2步之服务端标准配置文件

    服务端app.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...

  4. WCF使用地址去调用服务端的方法

    前面的章节已经讲过了WCF的代码和SVC页面的分离,这里是分离后,客户端调用代码如下: try { var myBinding = new BasicHttpBinding(); var myEndp ...

  5. WCF学习之旅—实现支持REST服务端应用(二十三)

    在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...

  6. WCF备忘录一:服务端实例的生命周期

    示例代码下载地址:WCFDemo1Day 概述 客户端向WCF服务发出请求后,服务端会实例化一个Service对象(实现了契约接口的对象)用来处理请求,实例化Service对象以及维护其生命周期的方式 ...

  7. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  8. 使用多种客户端消费WCF RestFul服务(一)——服务端

    RestFul风格的WCF既然作为跨平台.跨语言.跨技术的一种方式出现,并且在ASP.NET API流行起来之前还是架构的首选技术之一,那么我们就来简要的介绍一下WCF在各个平台客户端的操作. 开发工 ...

  9. WCF服务端与客户端时间匹配问题

    当服务端部署的WCF服务服务在被客户机调用时,如果显示: 错误,展开后,详细错误为:An error occurred when verifying security for the message ...

随机推荐

  1. Github客户端操作

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.作为一个程序员,我们需要掌握其用法. 作为开源代码库以及版本控制系统,Github目前拥有140 ...

  2. MySQL数据库性能优化

    mysql查询优化: 1.新增字段索引,查询时若使用到or关键字,则两个字段都需建立索引才能生效 2.sql语句包含子查询,mysql会创建临时表查询结束后删除,影响效率,所以应尽可能使用join替代 ...

  3. Cocoapods 报警告Automatically assigning platform ios with version 9.0 on target....

    Automatically assigning platform iOS with version 9.0 on target 你的工程名称 because no platform was speci ...

  4. SQL Timeout超时的处理方法

    第一步:修改Web.config配置文件.在数据库连接字符串中加上连接时间Connect Timeout,根据实际情况定时间. <!--连接数据库--> <connectionStr ...

  5. Android中如何实现EditText的自动换行

    要实现EditText的自动换行需要实现如下设置: <EditText android:id="@+id/function_lifingcost_edit_txtRemark" ...

  6. SpringBoot 中常用注解@Controller/@RestController/@RequestMapping介绍

    原文 SpringBoot 中常用注解 @Controller/@RestController/@RequestMapping介绍 @Controller 处理http请求 @Controller / ...

  7. 配置rsync 同步数据 rpm包安装rsync及配置

    [root@Hammer home]# rpm -qa |grep rsync #检查系统是否安装了rsync软件包rsync-2.6.8-3.1[root@Hammer CentOS]# rpm - ...

  8. JSP中scope属性 scope属性决定了JavaBean对象存在的范围

    scope属性决定了JavaBean对象存在的范围. scope的可选值包括: ---page(默认值) ---request ---session ---application   1.page范围 ...

  9. memcached 内存初始化与key-value存储

    本次笔记未涉及到slab的动态重新平衡分配 /**首先介绍一下一个跟内存相关的非常重要的概念,内存块类型数据结构:*/ typedef struct { unsigned int size; /* c ...

  10. linux下常用的截图、录屏工具

    录屏: 在linux下常用的录屏工具有5种,可以baidu或者google下喔,我选用的是recordMydesktop,使用非常方便,用时注意先把每秒桢数调高,否则效果必然很差. 在ubuntu下可 ...