当前位置: 首页 > 编程日记 > 正文

WCF入门(一)——简单的示例

这篇随笔写了一段时间了,当时没有发布,今天整理文档的时候发现了,顺便给配了些图。主要是绍了一下WCF编程模型,并给了一个简单的示例。

概述

WCF框架是下一代.NET平台通信应用程序的核心。它包含了Web服务、Remoting、同步和异步消息应用程序的开发,合并了所有最近有关的各种标准,建立了通过XML配置文件替代C#代码(如果你喜欢的话可以继续使用代码)对服务定义进行配置的模型。

WCF的设计思路是使开发者可以专注于开发所需的业务逻辑而不是增加工作(服务器和客户端之间的通信、数据传输等),WCF将为你处理这些问题,并且通过使用扩展的配置文件让一切变得更加容易实现。

WCF程序结构

一个完整的WCF解决方案包括如下四个部分:

  1. 契约(Contracts):    主要定义了实现那些服务,如何访问服务
  2. 服务(Services):        实现契约定义的方法
  3. 宿主程序(Hosting):    提供低层传输功能的支持
  4. 客户端(Client):        根据契约访问服务

下面我们就来逐一讲解如何实现一个简单的WCF程序。

实现契约和服务

契约通常是一个接口,定义了我们会提供哪些服务。以一个简单的计算器为例,假如我们要提供一个加减法的服务,则定义接口如下:

    public interface Icalculator
    {
        double Add(double x, double y);
        double Subtract(double x, double y);
    }

而服务则是如何实现这个契约,对于上述接口,实现方式如下:

    public class CalculatorService : Icalculator
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Subtract(double x, double y)
        {
            return x - y;
        }
    }

对契约和服务有了基本了解后,我们就可以在WCF程序中实现它了,我们通常把契约和服务放在一个类库项目中实现,首先新建一个WCF服务库项目(也可以新建一个类库项目,然后添加System.ServiceModel.dll的引用):

使用WCF服务库项目模板创建项目后,发现系统会自动提供了一个简单的契约和服务的实现,在这里我们将其替换成前面定义的接口和实现。

首先把契约文件IService1.cs替换成我们的接口:

    [ServiceContract]
    public interface ICalculator
    {
        
[OperationContract]
        double Add(double x, double y);

        
[OperationContract]
        double Subtract(double x, double y);
    }

可以看到,和前面定义的基本接口有点区别的是:

  • 接口名称上加了ServiceContract属性
  • 接口方法上加了OperationContract属性

这个是告诉WCF宿主程序定义的契约名称和要实现的接口,否则WCF宿主程序也无法知道该如何加载服务。实现服务的代码和前面一样,这里就不列出来了。

实现完我们的服务和契约后,按Ctrl+F5后就可以直接测试了。虽然我们没有编写客户端,但系统自动提供了一个WcfTestClient供使用的:

关于WCF测试客户端的更多信息,可以参看MSDN文章:启用WCF测试客户端(WCF Test Client)的相关技巧。

实现宿主程序

前面我们可以看到,编写WCF服务端程序时,虽然我们并没有实现宿主程序,但在客户端仍然能够访问服务。这是因为在测试Wcf库的时候,系统自动启动了一个宿主程序WcfSvcHost.exe,并加载了该服务,以便我们能测试访问。不过WcfSvcHost.exe只是一个轻量级的宿主程序,主要用于测试用,对于实际项目,我们可以把它部署到IIS中,都可以不用编写自己的宿主程序。

除了IIS外,我们也可以编写自己的宿主程序,通过一个控制台或窗口程序来实现宿主程序,这样也可以在没有IIS的机器上运行我们的服务,也可以更改低层传输协议,从而获取更高的传输效率等。

实现宿主程序也比较简单,首先创建一个控制台项目,然后添加System.ServiceModel.dll和前面定义的服务项目WcfService的引用,然后就可以实现宿主程序了:

        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(CalculatorService));
            host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://localhost:8733/Design_Time_Addresses/WcfService/Service1/");
            if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
            {
                ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                behavior.HttpGetEnabled = true;
                behavior.HttpGetUrl = new Uri("http://localhost:8733/Design_Time_Addresses/WcfService/Service1/wsdl");
                host.Description.Behaviors.Add(behavior);
            }

            host.Open();

            Console.WriteLine("CalculaorService
已经启动,按任意键终止服务!
");

            Console.Read();
            host.Close();
        }

这里的大部分都是配置操作,这个配置对新手来说非常多,写在代码里也不好看,因此通常是写在App.Config中,我这里是直接把WcfService工程中<system.serviceModel>直接拷贝过来的。要修改这个配置,可以使用VisualStudio中的WCF服务配置编辑器。

把配置挪到App.Config中后,代码可以简化如下:

    static void Main(string[] args)
    {
        ServiceHost host = new ServiceHost(typeof(CalculatorService));
        host.Open();

        Console.WriteLine("CalculaorService
已经启动,按任意键终止服务!
");

        Console.Read();
        host.Close();
    }

从代码中可以看到,我们只需要创建一个ServiceHost对象,然后调用Open方法开启服务即可,并不需要什么额外的操作,非常简单。

实现客户端

要实现客户端,我们需要知道如下两个信息:

  1. 服务端提供了那些服务
  2. 该如何采取这些方式访问服务

这个信息可以通过宿主程序发布的wsdl获取,客户端无需知道服务区的实现细节,直接根据wsdl地址即可。例如,对于前面的例子中,我的服务地址是:http://localhost:8733/Design_Time_Addresses/WcfService/Service1/(在App.config中配置的),直接通过浏览器可以wsdl的发布地址,并能获取相关信息。

有了该信息后,借助VisualStudio的强大功能就可以非常快捷的实现客户端程序了。我们首先插件一个控制台程序,然后添加web服务引用:

添加该服务后,和WebService一样,系统自动生成了Client类。

借助这个Client类,就可以访问前面的服务了。

    static void Main(string[] args)
    {
        using (var proxy = new CalculatorClient())
        {
            Console.WriteLine("{0} + {1} = {2}", 3, 5, proxy.Add(3, 5));
            Console.WriteLine("{0} - {1} = {2}", 3, 5, proxy.Subtract(3, 5));
        }
    }

实际上,根据服务端发布的wsdl信息,也可以使用java等其它语言编写,是一种非常灵活的方式。

小结

从本文中的这个例子可以看出,WCF非常好的上屏蔽了低层细节(服务器和客户端之间的通信、数据传输等),开发者只需要关注业务逻辑即可,并且非常灵活,是一门非常优秀的RMI技术。

关于WCF园子里有许多文章,这些都是非常好的学习材料,我目前也只是处于管中窥豹的阶段,后续有空再写写相关文章。

  1. 我的WCF之旅(1):创建一个简单的WCF程序
  2. 我的WCF之旅(2):Endpoint Overview
  3. 我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication)
  4. 我的WCF之旅(4):WCF中的序列化(Serialization)- Part I
  5. 我的WCF之旅(4):WCF中的序列化(Serialization)- Part II 
  6. 我的WCF之旅(5):Service Contract中的重载(Overloading)
  7. 我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案
  8. 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承 
  9. 我的WCF之旅(8):WCF中的Session和Instancing Management 
  10. 我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace
  11. 我的WCF之旅(10): 如何在WCF进行Exception Handling 
  12. 我的WCF之旅(11):再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯 
  13. 我的WCF之旅(12):使用MSMQ进行Reliable Messaging
  14. 我的WCF之旅(13):创建基于MSMQ的Responsive Service

转载于:https://www.cnblogs.com/TianFang/archive/2012/12/26/2834206.html

相关文章:

Callgrind--函数调用分析工具以及可视化方法

生成分析文件 命令行运行: valgrind --toolcallgrind ./palmGateMachine 检测完毕之后会生成一个文件callgrind.out.26805&#xff0c; 后面的数字其实是这个待测进程的pid 可视化方法 可视化方法 可视化工具 kcachegrind 1、下载地址: https://launchpad.net/ubuntu/trust…

Java中BASE64 编码

2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码&#xff0c;在很多地方都会用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder&#xff0c;用它们可以非常方便的完成基于 BASE64 的编码和解码。下面是本人编的两个小的函数…

java script (二)

实现轮播图 获取元素 document.getElementById("id名称") 事件&#xff08;onlond&#xff09; onlond "changeImg()" 在<script>中function changeImg(){ document.getElementById("img").src "图片地址"} 定时操作&…

转 [JAVA] 使用 common-fileupload 实现文件上传

就在前段时间&#xff0c;还在苦于找到不到合适的上传组件&#xff0c;虽然很早就知道了 common-fileupload&#xff0c;但当时却因为没有找到如何获取表单参数的方法而使用 jspSmartUpload&#xff0c;历尽艰辛终于找到了它的 jar&#xff0c;可是使用后才发现此东西对中文参数…

Cachegrind--缓存命中检查工具及其可视化

Cachegrind–缓存命中检查工具及其可视化 和 Callgrind–函数调用分析工具以及可视化方法 一模一样 命令改为: valgrind --toolcachegrind ./palmGateMachine 生成的文件名: cachegrind.out.8025 用kcachegrind 打开 参考我的另一篇文章&#xff1a; https://editor.csdn.…

java 快排_八大排序-快速排序(搞定面试之手写快排)

概要快速排序由C. A. R. Hoare在1960年提出&#xff0c;是八大排序算法中最常用的经典排序算法之一。其广泛应用的主要原因是高效&#xff0c;核心算法思想是分而治之。快速排序经常会被作为面试题进行考察&#xff0c;通常的考察思路是快排思想、编码实践之手写快排以及进一步…

maven命令简介

为什么80%的码农都做不了架构师&#xff1f;>>> 创建普通应用项目&#xff1a; mvn archetype:create -DgroupIdcom.byread -DartifactIdblog 创建WEB项目&#xff1a; mvn archetype:create -DgroupIdcom.byread -DartifactIdblogweb -DarchetypeArtifactIdmav…

分治策略解决幂乘问题

float fast_pow ( float x, float y ) {if ( y 1 )return x;else if ( (int)y % 2 0 )return fast_pow(x,y/2)*fast_pow(x,y/2);elsereturn fast_pow(x,(y-1)/2)*fast_pow(x,(y-1)/2)*x; } 转载于:https://www.cnblogs.com/Nicholastwo/p/9368076.html

用java实现一个计算器程序_1.2第一个java程序——hello world

第一个java程序——hello world实现一个java程序&#xff0c;主要有三个步骤&#xff1a;1、编写源代码&#xff0c;2、编译源代码&#xff0c;3、运行。java的源代码必须先编译&#xff0c;然后才能由JVM解析执行。所以我们程序员第一步的工作就是要编写java的源代码文件&…

linux valgrind Memcheck--内存检查工具

linux valgrind Memcheck–内存检查工具 使用方法: 注意&#xff0c;这里要用debug版本&#xff0c;如果是release的运行文件&#xff0c;则用debug编译出来的可执行文件替换 输出到终端: valgrind --toolmemcheck --leak-checkfull ./test.out输出到文件: valgrind --toolm…

Cassandra 1.2 发布,NoSQL 数据库

NoSQL 数据库 Cassandra 发布 1.2 正式版&#xff0c;该版本包含 CQL3&#xff0c;这是在 2012年4月发布的 1.1 版本中引入的。CQL 是一个 Cassandra 的建模和查询语言&#xff0c;类似关系数据库中的 SQL。CQL3 支持多列主键和很多其他的改进。 Another Cassandra 1.2 主要的增…

CQRS实践(3): Command执行结果的返回

上篇随笔讨论了CQRS中Command的一种基本实现。 面对UI中的各种命令&#xff0c;Controller会创建相应的Command对象&#xff0c;然后将其交给CommandBus&#xff0c;由CommandBus统一派发到相应的CommandExecutor中去执行&#xff0c;我们的ICommandBus的接口声明如下: public …

iOS学习——核心动画之Layer基础

iOS学习——核心动画之Layer基础 1、CALayer是什么&#xff1f; CALayer我们又称它叫做层。在每个UIView内部都有一个layer这样一个属性&#xff0c;UIView之所以能够显示&#xff0c;就是因为它里面有这个layer才具有显示的功能。我们可以通过操作CALayer对象&#xff0c;可以…

linux valgrind memCheck ---内存检查工具的可视化方法valkyrie

linux valgrind memCheck —内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1、安装valgrind valgrind 安装 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind2、安装valkyrie valkyrie下载连接: https://launchpad.net/ubuntu/…

屏幕为什么要正负压供电_负压变换器的设计

目前在工业、汽车电子系统中有诸如温度、压力、位置、重量和流量等物理参数的精确测量&#xff0c;这些信号中的一些传感器和前置放大器需要正负电压源驱动或供电&#xff0c;以提供足够宽的动态范围和抗干扰性。这些电子系统通常使用3.3V、5V、12V或24V中的某一电压的直流电源…

DataCleaner 3.1.1 发布,数据质量分析管理

DataCleaner 3.1.1 扩展了日期和时间相关的分析&#xff1b;增加周、月、年的分布分析&#xff1b;数值分析和日期时间分析增加了描述统计的选项&#xff1b;新增用于生成 UUID 和时间戳的转换器等等。 DataCleaner 是一个数据质量分析&#xff0c;比较&#xff0c;验证和监督的…

IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...

IIS负载均衡-Application Request Route详解第三篇&#xff1a;使用ARR进行Http请求的负载均衡&#xff08;上&#xff09; 在前两篇文章中&#xff0c;我们已经讲述如何配置与安装ARR&#xff0c;从本篇文章开始&#xff0c;我们将重点的来讲述如何在使用ARR进行负载均衡。 本…

云主机启动提示Booting from Hard Disk GRUB

版本&#xff1a;Openstack ocata 系统&#xff1a;centos7.3 环境&#xff1a;VMware workstation12 解决方法&#xff1a; 或者 转载于:https://www.cnblogs.com/fcing/p/9374855.html

函数 tostring_Kotlin实战之Fuel的高阶函数

Fuel 是一个用 Kotlin 写的网络库&#xff0c;与 OkHttp 相比较&#xff0c;它的代码结构比较简单&#xff0c;但是它的巧妙之处在于充分利用了 Kotlin 的语言特性&#xff0c;所以代码看上去干净利落。OkHttp 使用了一个 interceptor chain 来实现拦截器的串联调用&#xff0c…

linux valgrind 安装和使用

linux valgrind 安装和使用 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind Valgrind 是个开源的工具&#xff0c;功能很多。例如检查内存泄漏工具—memcheck。 Valgrind 安装&#xff1a; sudo apt-get install valgrind Valgrind 命令介绍&#xff…

UIPopoverController在ARC环境下用法注意

在ARC环境下如果便用以下代码&#xff1a; [cpp] view plaincopyprint?UIViewController *viewTwo; viewTwo [[ViewTwo alloc] initWithNibName:"ViewTwo" bundle:nil]; UIPopoverController *popover; popover [[UIPopoverController alloc] initWithConten…

CPLD的分频语言

分频器在FPGA/CPLD设计中是不可缺少的一部分&#xff0c;这就包括分频系数是奇数和偶数的&#xff08;我们称为奇分频和偶分频&#xff09;&#xff0c;而对于偶分频来说还有不同的分频方法&#xff0c;下面将给出具体的方法&#xff1a; 1、占空比不为50%的偶分频 占空比&…

彻底解决web开发中遇到的路径问题(上)

注&#xff1a;本文部分引用了网络上的文章&#xff0c;以及动力节点老师的讲解内容&#xff0c;感谢老师&#xff0c;嘻嘻。 为了举例方便&#xff0c;我新建了pathTest项目&#xff1a; 关于tomcat的配置&#xff0c;eclipse访问项目的路径一般是localhost:8080/projectName,…

关于Page翻页效果--Page View Controller

Page View Controllers你使用一个page view controller用page by page的方式来展示内容。一个page view controller管理一个self-contained视图架构。这个架构的父视图由page View controller管理&#xff0c;并且子视图由你提供的view Controllers管理。一&#xff0c;解析Pag…

linux平台下QtCreator中集成Valgrind系列工具

linux平台下QtCreator中集成Valgrind系列工具 ###1、valgrind 安装 valgrind 安装 2、打开QtCreator >> Analyze 你就会发现 这里已经有valgrind的相关选项了 如果没有的话&#xff0c; 在help >> about plugin >> C 中勾选 如图: 点击则可以直接运行…

python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解

本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在对图像进行深度学习时&#xff0c;有时可能图片的数量不足&#xff0c;或者希望网络进行更多的学习&#xff0c;这时可以对现有的图片数据进行处理使其变成一张新的…

CSS层叠样式

为了让网页元素的样式更加丰富&#xff0c;也为了让网页的内容和样式能拆分开&#xff0c;CSS由此思想而诞生&#xff0c;CSS是 Cascading Style Sheets 的首字母缩写&#xff0c;意思是层叠样式表。有了CSS&#xff0c;html中大部分表现样式的标签就废弃不用了&#xff0c;htm…

windows下 Source Monitor代码度量工具的使用

windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 SourceMonitor是一款免费的软件&#xff0c;运行在Windows平台下。它可对多种语言写就的代码进行度量&#xff0c;包括C、C、C#、Java、VB、Delphi和HT…

MVVM 数据绑定

一、在 XAML 中创建绑定 定义源对象。 C# public class Dog {public string DogName { get; set; } }在 XAML 中创建对源对象的命名空间的引用。 XAML <UserControl x:Class"BindingXAML.Page" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pres…

linux配置文件怎么把某行后几个字符替换_vim(Linux运维)

一、vim使用介绍 介绍在linux系统中&#xff0c;大部分配置文件都是ASCII的纯文本形式存放的&#xff0c;所以我们在修改系统设置的时候使用简单的文本编辑软件就可以实现了&#xff0c;如果你使用过windows当中的word的话&#xff0c;那么你可能会感觉linux字符界面的文本编辑…