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

[WCF编程]1.WCF入门示例

一、WCF是什么?

  Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,是Windows平台上开发分布式应用最佳的实践方式。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。

二、WCF的优势

  1.统一性

  WCF涵盖了之前微软推出的所有用于分布式开发的技术,包括Remoting、Web Services、WSE、MSMQ等,并以一种统一的编程模式来实现。

  2.互操作性

  WCF最基本的通信机制是SOAP(Simple Object Access Protocol 简易对象访问协议),这就保证了系统之间的互操作性,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持。

  3.安全性和可靠性

  WCF在安全性上,它完全遵循了WS-*的标准,在SOAP 的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。而建立在WS-Coordination和WS- AtomicTransaction之上的基于SOAP格式交换的信息,则支持两阶段的事务提交(two-phase commit transactions)。

  4.兼容性

  WCF充分的考虑到了与旧有系统的兼容性。安装WCF并不会影响原有的技术如ASMX和.Net Remoting。即使对于WCF和ASMX而言,虽然两者都使用了SOAP,但基于WCF开发的应用程序,仍然可以直接与ASMX进行交互。

特性

Web Service

.NET Remoting

Enterprise Services

WSE

MSMQ

WCF

具有互操作性的Web服务

支持

 

 

 

 

支持

.NET到.NET的通信

 

支持

 

 

 

支持

分布式事务

 

 

支持

 

 

支持

支持WS标准

 

 

 

支持

 

支持

消息队列

 

 

 

 

支持

支持

三、WCF简单示例

 1.建立解决方案

WCF.Host需引用WCF.Service,WCF.HostByWeb引用WCF.Service

  2.WCF.Service项目:

IHelloWorldService.cs文件:
   [ServiceContract(Namespace="www.cnblogs.com")]public interface IHelloWorldService{[OperationContract]string SayHello(string str);[OperationContract]Student Say();}[DataContract]public class Student{[DataMember]public string UserName { get; set; }[DataMember]public int Age { get; set; }[DataMember]public GenderMode Gender { get; set; }}public enum GenderMode{Man = 1,Woman = 2,UnKnown = 3}
HelloWorldService.cs
public class HelloWorldService : IHelloWorldService{public string SayHello(string str){return "您说了:" + str;}public Student Say(){Student stu = new Student(){UserName = "zxj",Age = 20,Gender = GenderMode.Man};return stu;}}

  3.WCF.Host(以控制台程序作为宿主)

    1.以配置文件的方式配置终结点

Program.cs文件
class Program{static void Main(string[] args){ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService));Console.ForegroundColor = ConsoleColor.DarkYellow;host.Open();Console.WriteLine("服务启动成功......");int i = 0;foreach (ServiceEndpoint endpoint in host.Description.Endpoints){i++;Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}",i, endpoint.Name, endpoint.Address, endpoint.Binding,Environment.NewLine);}Console.Read();}}

App.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><system.serviceModel><services><service name="WCF.Service.HelloWorldService"><endpoint address="http://localhost:8000/HelloWorldService" contract="WCF.Service.IHelloWorldService" binding="wsHttpBinding"></endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint><host><baseAddresses><add baseAddress="http://localhost:8000"/></baseAddresses></host></service></services><behaviors><serviceBehaviors><behavior><!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false --><serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/><!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --><serviceDebug includeExceptionDetailInFaults="false"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
</configuration>

2.以编程方式配置终结点

class Program{static void Main(string[] args){//编程方式配置终结点Uri baseAddress = new Uri("http://localhost:8000");ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService), baseAddress);WSHttpBinding binding = new WSHttpBinding();//寻找元数据ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();//获取宿主的行为列表if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为
            {metadataBehavior = new ServiceMetadataBehavior();metadataBehavior.HttpGetEnabled = true;host.Description.Behaviors.Add(metadataBehavior);}host.AddServiceEndpoint(typeof(WCF.Service.IHelloWorldService), binding, "HelloWorldService");host.AddServiceEndpoint(typeof(IMetadataExchange), binding , "mex");Console.ForegroundColor = ConsoleColor.DarkYellow;host.Open();Console.WriteLine("服务启动成功......");int i = 0;foreach (ServiceEndpoint endpoint in host.Description.Endpoints){i++;Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}", i, endpoint.Name, endpoint.Address, endpoint.Binding, Environment.NewLine);}Console.Read();}}

4.WCF.Client(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用

  这里使用svcutil.exe,生成服务端代理类,使用方法如下:

  Visual Studio ——>菜单栏——>工具——>外部工具

 启动宿主程序,最好使用右键——以管理员的身份打开控制台宿主程序

宿主程序启动后,打开svcutil.exe程序,

Visual Studio ——>菜单栏——>工具——>SvcUtil(这是前一步配置外部工具时svcutil.exe的标题)

打开之后如图所示,填入宿主元数据地址:

点击确定,

如果你在配置外部工具时,选择和我一样的配置,你可以在解决方案根目录下找到HelloWorldService.cs和output配置文件,将HelloWorldService.cs直接复制到WCF.Client项目中,打开output配置文件,将里面的内容复制到WCF.Client项目中App.config配置文件相应的地方

Program.cs

class Program{static void Main(string[] args){HelloWorldServiceClient client = new HelloWorldServiceClient();string temp = client.SayHello("你好!");Console.WriteLine(temp);Student stu = client.Say();Console.WriteLine("用户名:" + stu.UserName + ",年龄:" + stu.Age + ",性别:" + stu.Gender);Console.Read();}}

生成解决方案,先运行宿主控制台应用程序,再运行客户端控制台程序,客户端控制台程序结果如下图所示:

至此,基于控制台应用程序的宿主相关示例已经结束。下面介绍,基于Web应用程序的宿主相关示例:

  5.WCF.HostByWeb(宿主,Web程序)

  新建“WCF 服务应用程序”,如图所示:

 添加对WCF.Service项目的引用,删除IService1.cs,IService1.svc,新建WebHelloWorldService.svc页面

删除IWebHelloWorldService.cs和WebHelloWorldService.svc.cs文件,如图:

打开WebHelloWorldService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService2.WebHelloWorldService" CodeBehind="WebHelloWorldService.svc.cs" %>

修改为:

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.Service.HelloWorldService" %>

主要是Service="WCF.Service.HelloWorldService"。

右键WebHelloWorldService.svc,在浏览器中浏览:

这时我得到的网址为:http://localhost:32797/WebHelloWorldService.svc。

6.WCF.ClientByWeb项目(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用

在这里与第4步一样,也是使用svcutil.exe工具,根据URL地址生成对应的数据,可以直接参考第4步。

注意:本示例代码,仅供参考不能用于实际开发。 

源文件下载:WCF入门示例.rar

转载于:https://www.cnblogs.com/zxj159/p/3922280.html

相关文章:

ios 自动打包命令_iOS自动打包上传脚本

自从将swift2.2升级到swift3.0, 每次使用Xcode8编译都很慢&#xff0c;很是不爽&#xff0c;于是有了研究下xcodebuild命令行打包的想法&#xff0c;起初不知道用shell&#xff0c;还是用python, 在网上大概搜了一下&#xff0c;关于python的比较多点&#xff0c;于是就先学习p…

linux系统下添加新硬盘的方法详解

对于linux新手来说&#xff0c;在linux上添加新硬盘&#xff0c;是很有挑战性的一项工作。在Linux服务器上把硬盘接好&#xff0c;启动linux&#xff0c;以root登陆。 fdisk -l ## 这里是查看目前系统上有几块硬盘 Disk /dev/sda: 36.4 GB, 36401479680 bytes 255 heads, 63 s…

【CF EDU59 E】 Vasya and Binary String (DP)

题意 给一串01串&#xff0c;对该串进行若干次操作&#xff0c;直到串为空 操作为&#xff1a;选择一段连续的0或者1,删除它&#xff0c;拼接前后两部分成为新串&#xff0c;得到价值为a[删除的长度]&#xff08;a为给定的数组&#xff09; 思路 一个非常规的DP 考虑题目所给的…

leetcode-21 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 总体思路是&#xff1a; 比较两个链表头节点&#xff0c…

log4cxx第三篇----使用多个logger

使用多个logger时&#xff0c;所有logger的配置写在一个配置文件里面 两个例子&#xff1a; 1 一个继承的例子&#xff08;http://logging.apache.org/log4cxx/&#xff09; // file com/foo/bar.h #include "log4cxx/logger.h"namespace com {namespace foo {class…

authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...

众所周知&#xff0c;微信坐拥12亿用户&#xff0c;已经是国民应用&#xff0c;而其中小程序依托于微信生态日活已经超过4亿&#xff0c;对于国内的一些商家来讲是不可错过的流量圣地&#xff0c;那么对于做跨境的朋友来讲怎么利用起来了&#xff1f;今天给大家介绍一款无缝对接…

Ubuntu环境变量

2019独角兽企业重金招聘Python工程师标准>>> Ubuntu 环境变量 环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执…

mysql 免安装

1. 解压得到如下目录 2. 配置环境变量 D:\Program Files\mysql-5.7.11-winx64\bin 3. 安装的根目录&#xff0c;新增 my.ini 文件 [mysqld] port 3306 character_set_serverutf8 basedir D:\Program Files\mysql-5.7.11-winx64 datadir D:\Program Files\mysql-5.7.…

leetcode-23 合并K个排序链表

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 方法一&#xff1a; 使用vector数组存多个链表的所有节点&#xff0c;进行从小…

Access应用日志一

今天在确认实习生不能帮忙搭建数据库后&#xff0c;自己根据业务需求尝试搭了一个小型access数据库。 主要目的&#xff1a;储存历史月度数据&#xff0c;避免每次从公司数据库下载数据的麻烦&#xff0c;节省数据拉取时间。 搭建了以acct id为主键的两种数据。 1&#xff09;客…

mongodb检查点_mongodb 监控命令mongostat

mongodb 监控命令mongostat2016/03/07 15:11 于 数据分析mongostat实用工具提供了mongoDB一个实例快速概述和当前运行的状态。mongostat功能类似于UNIX / Linux文件系统实用vmstat,mongostat只不过是提供 mongodb 的数据。监控包含的数据&#xff1a;服务器状态数据副本状态数据…

RunnableException与CheckedException

Checked Exception 编译时异常 编译的时候检查你的代码可能在运行的时候抛出异常&#xff0c;这通常在编译的时候要去处理的。 RunnableException 运行时异常&#xff0c;可以编译通过&#xff0c;但如果不处理运行时会导致崩溃&#xff0c;需要对其进行try....catch...处理。 …

Educational Codeforces Round 59 (Rated for Div. 2)

A.Digits Sequence Dividing 题意&#xff1a;给你一个1-9的数字字符串&#xff0c;把它划分成若干段&#xff08;>2&#xff09;段&#xff0c;使其大小递增。 错误&#xff1a;当长度为2的时候没考虑 #include<cstdio> #include<cmath> #include<cstring&g…

leetcode-225 队列实现栈

使用队列实现栈的下列操作&#xff1a; push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空 队列的特点&#xff1a;先入先出 栈的特点&#xff1a;后入先出 即我们每次添加元素到队列时&#xff0c;想要达到栈的效果&#xff0c;…

详解Java Math类的toDegrees()方法:将参数从弧度转换为角度

Java Math 类的 toDegrees() 方法是将一个角度的弧度表示转换为其度表示,返回值为double类型,表示从弧度数转换而来的角度数。这就是Java Math 类的 toDegrees() 方法的攻略。我们已经了解了该方法的基本概念、语法、注意事项以及两个示例。希望这篇攻略对你有所帮助。

python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)

TacotronV2 WaveRNN开源中文语音数据集标贝(女声)训练中文TacotronV2&#xff0c;实现中文到声学特征(Mel)转换的声学模型。在GTA模式下&#xff0c;利用训练好的TacotronV2合成标贝语音数据集中中文对应的Mel特征&#xff0c;作为声码器WaveRNN的训练数据。在合成阶段&#x…

SpringBoot接口防抖(防重复提交)的一些实现方案

作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。啥是防抖所谓防抖,一是防用户手抖,二是防网络抖动。

OC语言基础笔记

OC方面的基础笔记:1.类的基本用法#import <Foundation/Foundation.h>// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件// ----interface section----// OC中声明和实现是分离的, 两个都必须有.interfac…

Docker 数据卷之进阶篇

Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇笔者在《Docker 基础 : 数据管理》一文中介绍了 docker 数据卷(volume) 的基本用法。随着使用的深入&#xff0c;笔者对 docker 数据卷的理解与认识也在不断的增强。本文将在前文的基础上介绍 docker 数据卷的原理及一些高级用…

leetcode-232 用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空 栈的特点&#xff1a;后入先出 队列的特点&#xff1a;先入先出 使用一个数据栈&#xff0c;一个辅…

sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)

本文基于 Spark 2.4.4 版本的源码&#xff0c;试图分析其 Core 模块的部分实现原理&#xff0c;其中如有错误&#xff0c;请指正。为了简化论述&#xff0c;将部分细节放到了源码中作为注释&#xff0c;因此正文中是主要内容。第一部分内容见&#xff1a;Spark学习&#xff1a;…

Tips——IndexSearcher自动更新

情景描述 为了调高效率&#xff0c;创建全局变量IndexReader取代每次查询新建IndexReader所带来的效率问题。 当时每天会更新一边索引8.23号部署的Index服务&#xff0c;Search服务&#xff0c;结果index都更新到了8.25&#xff0c;查询结果还是8.23的 Tips分享 先来看一下Inde…

公司运作 - 利润率、周转率

公司一般由市场部、研发部、财务部、人力资源部及其他辅助部门组成。分成了几个层面&#xff0c;如下&#xff1a; 宏观层面&#xff1a;业务范围、业务定位、专业化、多元化部门层面&#xff1a;各部门绩效、部门职责主体层面&#xff1a;跨部门事务&#xff0c;如产品研发涉及…

测试用例设计方法基础理论知识

一、什么是测试用例 测试用例设计&#xff1a;将软件测试的行为活动&#xff0c;作为一个科学化的组织归纳。 测试用例&#xff1a;设计一个情况&#xff0c;软件程序在这种情况下&#xff0c;必须能够正常运行并且达到程序所设计的执行结果。 因为我们不可能进行穷举测试&…

leetcode-155 最小栈

设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例&#xff1a; MinStack minStack new Mi…

legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解

更多文章&#xff0c;请见&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzIxODczMDUwOA&hid2&sn7928727456d49032f08ef1fcf0ee719e&scene18#wechat_redirect​mp.weixin.qq.com大家好&#xff0c;我是你们的机房老哥&#xff01; 计算机绘图是老哥很早就…

查询Master下的系统表和系统视图获取数据库的信息和简单的渗透测试

在SQL中可以通过查询Master下的系统表&#xff08;sys&#xff09;和系统视图&#xff08;information_schema&#xff09;获取数据库的信息。SQL2000和SQL2005的结构略有不同。 系统表结构参考系统表详细说明。 系统信息结构图参考&#xff1a;http://dev.mysql.com/doc/refma…

cocos2d-x android 移植 问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于android系统目前没有将boost加入&#xff0c;这里面使用了大量的STL及C的一些语言特性&#xff0c;导致编译出现令人非常头痛的问题。 1、出现类似的异常函数错误 boost/exception/detail/exception_ptr.hpp:382…

python插入排序演示源码

工作闲暇时间&#xff0c;把写内容过程较好的内容段做个备份&#xff0c;下面的内容内容是关于python插入排序演示的内容&#xff0c;应该能对各朋友也有用处。 def insert_sort(t): for i in xrange(len(t)): key t[i] j i - 1 while j>-1 and t[j]>key:#如果当前值比…

leetcode-215 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k 2 输出: 5 该题比较简洁的解法&#xff0c;我们使用堆来完成 最小堆&#xff1a;即堆顶为所…