我的WCF之旅(2)Endpoint Overview
- 格式:docx
- 大小:118.90 KB
- 文档页数:20
WCF学习——终结点(Endpoint)终结点是⽤来发送或接收消息(或同时执⾏这两种操作)的构造。
终结点包括⼀个定义消息可以发送到的⽬的地的位置(地址)、⼀个描述消息应如何发送的通信机制规范(绑定),以及对可以在该位置发送或接收(或同时执⾏这两种操作)的⼀组消息的定义(服务协定,⽤于描述可以发送哪些消息)。
与WCF服务的所有通信都是通过该服务的终结点进⾏的。
利⽤终结点,客户端可访问WCF服务提供的功能。
终结点包括四个属性:指⽰可以查找终结点的位置的地址(Address);指定客户如何与终结点进⾏通信的绑定(Binding);标识可以操作的协定(Contract);指定终结点的本地实现细节的⾏为(Behavior).可以理解终结点由ABC构成,ABC分别为Address、Binding、Contract。
地址:地址唯⼀地标识终结点,并告诉服务的潜在客户其所在的位置。
在 WCF 对象模型中,地址EndpointAddress 类表⽰。
⼀个EndpointAddress 类包含:⼀个表⽰服务地址的 Uri 属性。
⼀个表⽰服务安全标识和可选消息头集合的 Identity 属性。
可选消息头⽤于提供其他更多详细寻址信息来标识终结点或与终结点交互。
绑定:绑定指定如何与终结点进⾏通信。
这包括:要使⽤的传输协议(例如,TCP 或 HTTP)。
要⽤于消息的编码(例如,⽂本或⼆进制)。
必需的安全要求(例如,SSL 或 SOAP 消息安全)。
协定:协定概述了终结点向客户端公开的功能。
协定指定:客户端可以调⽤的操作。
消息的窗体。
调⽤操作所需的输⼊参数或数据的类型。
客户端可以预期的处理或响应消息的类型。
⾏为:可以使⽤终结点⾏为来⾃定义服务终结点的本地⾏为。
终结点⾏为是通过参与构建 WCF 运⾏库的过程来实现这⼀点的。
终结点⾏为的⼀个⽰例是 ListenUri 属性,可以利⽤该属性指定与 SOAP 或 Web 服务描述语⾔ (WSDL) 地址不同的侦听地址。
/artech/archive/2007/02/28/659331.ht ml我的WCF之旅(1):创建一个简单的WCF程序为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。
本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。
对那些对WCF不是很了解的读者来说,这个例子将带领你正式进入WCF的世界。
在这个例子中,我们将实现一个简单的计算服务(CalculatorService),提供基本的加、减、乘、除的运算。
和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器以致跨网络的服务调用。
在本例中,客户端和服务通过运行在相同的同一台机器上不同进程模拟,图1体现了客户端和服务端进程互相调用的关系。
图1 计算服务应用运行环境WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。
在我们的计算服务应用中,采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Hosting.exe);通过IIS寄宿方式将服务寄宿于IIS中(寄宿进程为IIS的工作进行W3wp.exe)。
客户端通过另一个控制台应用模拟(进程为Client.exe)。
接下来,我们就一步一步来构建这样的一个WCF应用。
步骤一:构建整个解决方案通过VS 2008创建一个空白的解决方案,添加如下四个项目。
项目的类型、承载的功能和相互引用关系如下,整个项目在VS下的结构如图2所示。
Contracts:一个类库项目,定义服务契约(Service Contract),引用System.Servi ceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中);∙Services:一个类库项目,提供对WCF服务的实现。
定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,所以Services具有对Contracts项目的引用;∙Hosting:一个控制台(Console)应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集;∙Client:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。
wcf万圣节2篇一:wcF分布式开发步步为赢(2)自定义托管宿主wcF解决方案开发配置过程详解wcF分布式开发步步为赢(2)自定义托管宿主wcF解决方案开发配置过程详解所属分类:wcF分布式开发步步为赢,SoaandEai上一节《wcF分布式框架基础概念》我们介绍了wcF服务的概念和通信框架模型,并给出了基于自定义托管服务的wcF程序的实现代码。
考虑到wcF分布式开发项目中关于托管宿主服务配置和客户端添加引用。
两个环节最容易出错。
对于大部分想学习wcF分布式开发的人来说,成功开发、配置、部署第一个自己的wcF服务困难重重。
很多资料都介绍了wcF的基本概念。
但是对于实际的项目开发过程介绍粗略,给入门者带来诸多不便。
今天我们就来补充一节wcF 分布式开发一个完整解决方案的开发和配置过程。
本节基本结构是:首先介绍【1】wcF服务解决方案的项目组成【2】wcF服务的开发和配置过程,【3】自定义宿主的开发和配置过程【4】客户端的服务引用和配置过程。
【总结】算是为各位wcF分布式技术开发的爱好者,提供的一个开发参考。
【1】wcF服务解决方案的项目组成:1.1】wcF服务:通常来说,wcF服务由三个部分构成:???服务类:包含服务契约、操作契约和数据契约的定义和实现;宿主:一种应用程序域和进程,服务将在该环境中运行;终结点:在客户端,用于访问服务。
我们这里的解决方案包括服务类项目、托管宿主、和简单的客户端程序,结构如图:1.2】客户端应用程序:上一节我们介绍了wcF的基本概念,wcF基本通信机制是基于SoaP 消息,SoaP消息基于XmL语言,因此wcF应用程序可与运行于各种上下文环境的其他进程进行通信,当然也支持跨系统、跨平台的应用程序之间的数据交互。
基于wcF构建的分布式应用程序可与下列所有程序进行交互:??同一windows计算机上不同进程中的wcF应用程序。
另一windows 计算机上的wcF应用程序。
WCF从理论到实践(2):决战紫禁之巅本文的出发点通过阅读本文,能解决如下问题:1.WCF与以往的分布式技术有何区别?2.WCF 在安全性方面做了哪些改进?3.WCF在性能方面有那些改进?4.WCF开发模型和以往的其他分布式技术有何区别?上面的表格参考了Bruchzhang文章中的对比图,原文地址:/wayfarer/archive/2006/04/05/367474.html从表格中我们可以看出,WCF似乎等于前面几项技术之和,但事实并非如此,它既整合了原来的多项技术,而且拥有着自己得天独厚的优点,如下:1.统一性(Integration)2.互操作性3.安全可靠(Secure and Reliable)4.兼容性WCF 在安全性方面做了哪些改进?为了保证数据通讯的安全,WCF提供了三种保护措施:1)机密性(Confidentiality)2)完整性(Integrity) 3)可验证性(Authentication),这三为了跟踪Web Service和WCF的消息,我们还需要了解一下两个工具:1.Microsoft SOAP Toolkit Version 3 中的Trace Utility2.tcpTrace原来一直用Trace Utilty来跟踪xml web service的消息报文,非常好用,它能按包显示出Soap信息,看起来也非常方便。
有关它的消息,请从/downloads/details.aspx?FamilyId=C943C0D D-CEEC-4088-9753-86F052EC8450&displaylang=en上下载SOAP Toolkit 3.0,安装后,便出现了这个工具,在跟踪xml web service的消息报文的时候,这个工具很好用,但跟踪wcf的报文却不行,能截获到数据,但每个报文都是空的,可能也和wcf报文是经过加密的有关系吧,搜索了一下,在artech的blog中发现这么一篇文章:[原创]我的WCF之旅(9):如何在WCF 中使用tcpTrace来进行Soap Trace,解决了我不能跟踪wcf消息报文的难题,他也提到Trace Utilty不能跟踪wcf,同时建议大家使用tcpTrace,并且说明了使用方法,对tcpTrace不熟悉的同学可以到他的blog上学习,很实用,我在这里就不再赘述。
wcf 实例架构例子WCF(Windows Communication Foundation)是微软推出的用于创建分布式应用程序的框架。
它提供了一种统一的编程模型,用于在不同的平台和技术之间进行通信。
下面是一些关于WCF实例架构的例子。
1. 服务契约(Service Contract):WCF实例架构中的服务契约定义了服务的操作合同。
它指定了服务的方法、参数和返回类型。
例如,一个银行的WCF服务契约可以包含获取账户余额和转账等方法。
2. 数据契约(Data Contract):WCF实例架构中的数据契约定义了在服务之间传输的数据模型。
它指定了数据的结构和属性。
例如,一个电子商务的WCF服务可以定义一个数据契约来表示订单的信息。
3. 终结点(Endpoint):WCF实例架构中的终结点指定了服务的访问地址和通信协议。
一个WCF服务可以有多个终结点,每个终结点可以使用不同的协议和地址。
例如,一个在线聊天的WCF服务可以有一个终结点使用TCP协议,另一个终结点使用HTTP协议。
4. 客户端代理(Client Proxy):WCF实例架构中的客户端代理是客户端应用程序用来与WCF服务进行通信的类。
客户端代理通过引用服务的元数据生成,提供了与服务的方法进行交互的方式。
例如,一个电子邮件客户端可以使用WCF客户端代理来发送电子邮件。
5. 消息(Message):WCF实例架构中的消息是在服务和客户端之间传输的数据单元。
它包含了操作的输入和输出参数,以及与消息传输相关的元数据。
例如,一个WCF服务的输入消息可以包含一个订单信息的数据契约。
6. 通道(Channel):WCF实例架构中的通道是用于在服务和客户端之间传输消息的组件。
通道可以使用不同的协议和传输方式,如HTTP、TCP和消息队列等。
例如,一个WCF服务可以通过HTTP通道接收和发送消息。
7. 消息编码器(Message Encoder):WCF实例架构中的消息编码器用于将消息转换为字节流进行传输。
WCF教程首先,让我们了解WCF的核心概念。
WCF服务由三个主要组件构成:契约(Contract)、绑定(Binding)和终结点(Endpoint)。
契约定义了服务要提供的操作和数据类型。
绑定定义了服务与客户端之间的通信方式。
终结点定义了网络地址和协议,用于访问服务。
在WCF中,契约定义了服务的操作和数据类型。
它们可以是简单的方法调用,也可以是消息传递。
契约可以分为服务契约和数据契约。
服务契约包含操作契约和消息契约,操作契约定义了服务要提供的操作,消息契约定义了操作契约的输入和输出消息的报文格式。
数据契约定义了在服务和客户端之间传输的数据类型。
绑定定义了服务与客户端之间的通信方式。
WCF提供了多种不同的绑定选项,可以选择适合应用程序需求的绑定类型。
常见的绑定类型包括基本绑定、TCP绑定、HTTP绑定等。
终结点定义了服务的网络地址和协议,用于访问服务。
WCF支持多种不同的终结点类型,包括基本终结点、TCP终结点、HTTP终结点等。
每个终结点可以指定一个绑定和一个契约。
现在,让我们开始创建第一个WCF服务。
第一步是创建WCF服务项目。
打开Visual Studio,选择“新建项目”,然后选择“WCF服务应用程序”模板。
接下来,给项目起一个名称,并选择创建的位置。
点击确定开始创建项目。
创建了WCF服务项目后,我们需要定义一个契约。
在项目中添加一个新的接口文件,然后在接口中定义服务的操作和数据类型。
例如,我们可以定义一个简单的计算器服务,包含添加和乘法操作。
接下来,我们需要实现契约中定义的操作。
在项目中添加一个新的类文件,并实现接口中定义的操作。
在实现操作时,我们可以使用C#或其他语言来编写逻辑。
接下来是配置WCF服务。
在项目中添加一个新的配置文件,然后在文件中定义服务的终结点和绑定。
我们可以选择使用哪种协议和地址来访问服务。
在配置完成后,我们可以运行WCF服务。
运行服务后,会在本地启动一个宿主进程,等待客户端的请求。
WCF开发日志-- WCF启动多个服务场景:项目比较大,不可能所有契约在一个类里来实现,可能会有上百个服务上千个契约,按照目前在网上搜索的结果是…..只能一个servicehost对应一个服务,某个mvp的建议是所有契约都放到一个类里来实现。
我崩溃。
想法:也有人建议用partial class的方式,把不同的契约分布到不同的CS文件里,虽然可能看上去好一点,但每回添加服务都得重编译,我觉得太扯淡了。
我希望是尽可能的把服务根据功能的不同按模块划分开来,不同的服务做成不同的dll,以插件的形式注册到一个表里,用servicehost来加载,不知大家有没有好的建议。
其实可以考虑用的方案,只写一个服务,它称为统一入口,这个方式还是不错的,就是他为解决并发,并发好像在博客园里有人写了怎么实现,地址是/zgynhqf/archive/2010/07/01/1769 228.html现实:说一千道一万架不住我不会,我只能实现:1、如何在Windows中Host多个WCF服务?2、不能是多个Open方法,那样太幼稚了!3、考虑到整个团队都不会,或OEA 就我会一点:),这个还的多谢周哥,和胡总的栽培了。
4、整个团队学习成本太高,只有不断的分享,讨论来加快进度了。
二、本文大纲a、摘要。
b、本文大纲。
c、项目准备阶段。
d、主要核心代码。
e、达到的效果图。
三、项目准备阶段这个图需要一点C# 基础才能看的懂的:)估计一上图大家就看的懂(自己想象中……..)了。
这里主要是创建Windows项目和WCF Service Library 项目Windows项目还需要引用WCF Service Library 项目四、主要核心代码运行按钮事件代码:1: private void button1_Click(object sender, EventArgs e)2: {3: if (button1.Tag == "run")4: {5: ServiceStart();6: button1.Text = "停止(&X)"; 7: button1.Tag = "stop";8: }9: else10: {11: button1.Text = "运行(&R)"; 12: button1.Tag = "run";13: }14: }15:ServiceStart() 函数代码:1: private List<ServiceHost> serviceHosts = new List<ServiceHost>();2: private void ServiceStart()3: {4:5: #region 初?始?化ˉ serviceHosts6: if (serviceHosts != null)7: {8: foreach (ServiceHost t in serviceHosts) 9: {10: if (t != null)11: t.Close();12: }13: }14: else15: {16: serviceHosts = newList<ServiceHost>();17: }18: #endregion19:20: string serviceAddress =string.Format("net.tcp://{0}:{1}", "127.0.0.1", "8000"); 21:22: Dictionary<Type,Type> sevtypes=new Dictionary<Type,Type>();23:sevtypes.Add(typeof(IService1),typeof(Service1)); 24: sevtypes.Add(typeof(IService2),typeof(Service2));25:26: string endpointAddress = string.Empty; 27: string tName = string.Empty;28: StringBuilder msgService = new StringBuilder();29: foreach (var item in sevtypes)30: {31: tName = .Substring(1); 32: endpointAddress = serviceAddress +tName;33: if (!serviceAddress.EndsWith("/"))34: endpointAddress =string.Format("{0}/{1}", serviceAddress, tName);35: ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress)); 36:37: //加载元数据结点38: ServiceMetadataBehavior smb = new ServiceMetadataBehavior();39:serviceHost.Description.Behaviors.Add(smb);40:serviceHost.AddServiceEndpoint(typeof(IMetadataExchan ge), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");41: //加载NetTcpBinding结点42: NetTcpBinding netTcpBinding = new NetTcpBinding();43: netTcpBinding.Security.Mode = SecurityMode.None;44: netTcpBinding.ReceiveTimeout =TimeSpan.Parse("00:10:00");45: netTcpBinding.MaxBufferPoolSize = 2147483647;46: netTcpBinding.MaxBufferSize = 2147483647;47: netTcpBinding.MaxConnections = 10; 48:49: netTcpBinding.ReaderQuotas.MaxDepth = 2147483647;50:netTcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647;51:netTcpBinding.ReaderQuotas.MaxArrayLength = 2147483647;52:netTcpBinding.ReaderQuotas.MaxBytesPerRead = 2147483647;53:netTcpBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;54:netTcpBinding.MaxReceivedMessageSize = 2147483647; 55:serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress);56:57: serviceHost.Opened += delegate58: {59:msgService.AppendLine(string.Format("{0}开始监听Uri 为:{1}/mex", tName, endpointAddress.ToString()));60: };61:62: serviceHost.Open();63: serviceHosts.Add(serviceHost);64: }65: this.textBox1.Text = msgService.ToString(); 66: }67:代码约定:每次增加服务和契约的时候都需要同时添加Dictionary 要不然系统不会启动新增加的服务。
WCF面试知识点1. 什么是WCFWCF(Windows Communication Foundation)是一个用于构建分布式应用程序的微软平台。
它提供了一种统一的编程模型,用于构建可靠、可扩展和安全的服务导向应用程序。
WCF支持多种传输协议(如HTTP、TCP、MSMQ等),并具有内置的安全性、可靠性和事务支持。
它使用基于SOAP的消息传递机制,可以在不同的平台和技术之间进行通信。
2. WCF的核心概念2.1 服务契约(Service Contract)服务契约定义了服务所提供的操作(方法)和消息。
它使用属性和接口来描述服务的行为和数据格式。
[ServiceContract]public interface ICalculatorService{[OperationContract]double Add(double x, double y);[OperationContract]double Subtract(double x, double y);}2.2 绑定(Binding)绑定定义了服务和客户端之间的通信方式,包括传输协议、编码方式和安全性要求等。
<bindings><basicHttpBinding><binding name="BasicHttpBinding_ICalculatorService" /></basicHttpBinding></bindings>2.3 终结点(Endpoint)终结点定义了客户端如何与服务进行通信。
它包含绑定信息、服务地址和协定等。
<endpoint address="http://localhost/CalculatorService"binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_ICalculatorService "contract="CalculatorService.ICalculatorService"name="BasicHttpBinding_ICalculatorService" /></client>2.4 服务宿主(Service Host)服务宿主是承载WCF服务的应用程序。
WCF学习之旅WCF的全称是Windows Communication Foundation,从英文名称上看,WCF 就是基于Windows下一种通讯的基础架构。
利用WCF能够实现基于Windows 下的各种通讯技术的开发以及应用。
WCF本身是.NET Framework 3.0 的组成部分之一。
和WPF、CardSpace、WF同样都是他的组件,存在其中的。
如果你使用的系统是VISTA,或者将来是使用的Windows Server 2008系统。
就是说你的操作系统就已经支持WCF了。
如果你的系统是Windows XP SP2 或者是Windows Server 2003的话,你得去微软网站上下载.NET Framework 3.0。
安装以后,在应用和开发就可以使用WCF了。
来看一下WCF能具体给我们的开发和应用带来哪些好处。
或者说它具体的作用是什么?首先,它是Microsoft平台上的面向服务即SOA架构。
那么它主要的作用就是用于构建分布式和可交互操作的应用程序。
它最大的特点就是把以前的许多种不同的开发模型统一了起来。
即统一了ASMX、.NET Remoting、Enterprise Services的开发模型。
以前不同的问题我们得要使用不的开发模型来解决。
这样的话它会给我们带来一个问题,作为开发人员而言,我们在解决不同的问题,就得学习不同的技术。
这样的话,就给我们的学习带来了额外的成本,增加了我们学习的难度和学习方面和开销。
WCF的出现,主要作用就是统一了前面所说的那几种不同的开发模型。
使得我在统一的编程模型当中来使用不同的技术,来分别解决不同的应用的需求。
第二点就是,在WCF当中,把配置提高到一种非常灵活的层面。
如协议的选择,消息的格式,进程分配等信息都可以在配置文件中来完成。
大家都知道,通过配置文件的方式来完成协议的选择,消息的格式,进程分配,给我们带的好处是让我们应用程序非常灵活。
使用应用程序的可扩展性、需求的变更带来灵活的选择。
WCF入门教程本节中包含的主题旨在帮助您快速了解 Windows Communication Foundation (WCF) 编程体验。
这些主题要根据本主题底部的列表中的顺序完成。
通过学习本教程,您可以初步了解创建 WCF 服务和客户端应用程序所需的步骤。
服务是一种构造,它公开一个或多个终结点,其中每个终结点都公开一项或多项服务操作。
服务的终结点指定下列信息:服务所在的位置;一个绑定,其中包含客户端必须与服务进行通信的信息;一个协定,用于定义服务向其客户端提供的功能。
在完成本教程中的系列主题之后,您将会得到一个正在运行的服务,以及一个可以调用该服务的操作的客户端。
前三个主题描述如何使用协定定义服务,如何实现服务,以及如何在代码中配置服务、承载服务和运行服务。
所创建的服务是自承载服务,客户端和服务都在同一计算机上运行。
服务使用代码而非配置进行配置。
另外还可以将服务承载于 Internet 信息服务 (IIS) 下。
有关如何执行此操作的更多信息,请参见“如何:如何:在 IIS 中承载 WCF 服务”。
也可以在配置文件中配置服务。
有关使用配置文件的更多信息,请参见使用配置文件配置服务。
后三个主题描述如何创建客户端代理,如何配置客户端应用程序,以及如何创建和使用可以访问服务功能的客户端。
服务会发布可以访问的元数据,这些数据定义了客户端应用程序与服务操作进行通信所需的构造。
WCF 提供了一个ServiceModel Metadata Utility Tool (Svcutil.exe)来自动完成以下过程:访问发布的这些元数据,然后使用这些元数据来构造和配置服务的客户端应用程序。
本节中的所有主题均假定您使用 Visual Studio 2008 作为开发环境。
如果您使用的是其他开发环境,请忽略特定于 Visual Studio 的说明。
注意:如果运行的是 Windows Vista,则必须通过在“开始”菜单上右击 Microsoft Visual Studio 2008,然后选择“以管理员身份运行”的方式来启动 Visual Studio。
在网上看到好多人都在讨论WCF的配置,ServiceHost,Client,EndPoint等等……,其实当我们在WEB项目中添加一个WCF服务时,系统自动生成了好多配置就放在了文件中的某个节点,刚开妈整WCF 的时候还老纳闷儿,为什么别人说的配置之类的跟我做的东西没有什么关系难道我做的就不是WCF服务呵呵,后来才发现,原来自己太小儿科了。
下面我也侃侃一个关于WCF的配置问题:ServiceHost:配置1<xml version="" encoding="utf-8" >2<configuration>3<!--<> section -->4<>5<!-- services 节点中包含着所有Service的配置说明-->6<services>7<!-- 第一个服务的配置开始都是一个<service ****>节点8相关属性解释:9name - 指定这个service配置是针对的哪一个WCF服务的10(名称空间.类型名),ServiceHost载入一个服务后,会到配置文件中的<services>下找有没有11name属性跟服务匹配的<service>的配置12behaviorConfiguration - 指定在<serviceBehaviors>下的一个<b ehavior>的name,这个特定<behavior>13给这个servic e制定了一些行为,比如服务是否允许身份模拟-->14<service name=""behaviorConfiguration="BehaviorName">15<!-- 每个服务可以有多个Endpoint,下面<endpoint>元素对每个Endpoint分别进行配置16属性说明:17address - 指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的18相对地址。
WCF使用流程WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的框架。
它提供了一种统一的编程模型,可以在不同的应用程序之间进行通信,并支持多种传输协议和消息格式。
本文将详细描述WCF的使用流程,包括创建服务和客户端、配置服务和客户端、部署和测试。
1. 创建服务首先,我们需要创建一个WCF服务。
下面是创建WCF服务的步骤:步骤1:创建一个新的WCF服务项目在Visual Studio中,选择”新建项目”,然后选择”WCF”类别下的”WCF服务应用程序”模板。
输入项目名称并点击”确定”。
步骤2:定义服务契约打开生成的IService.cs文件,在其中定义服务契约(Service Contract)。
契约是一个接口,它定义了可由客户端调用的操作。
[ServiceContract]public interface IService{[OperationContract]string GetData(int value);}步骤3:实现服务契约打开生成的Service.cs文件,在其中实现契约中定义的操作。
这些操作将在客户端调用时执行。
public class Service : IService{public string GetData(int value){return $"You entered: {value}";}}步骤4:配置服务终结点打开生成的App.config文件,在其中配置服务终结点。
终结点定义了服务的地址、协议和消息格式。
<system.serviceModel><services><service name="WcfService.Service"><endpoint address="" binding="basicHttpBinding" contract="WcfService.ISe rvice" /><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExch ange" /></service></services><behaviors><serviceBehaviors><behavior><serviceMetadata httpGetEnabled="true" /><serviceDebug includeExceptionDetailInFaults="false" /></behavior></serviceBehaviors></behaviors></system.serviceModel>2. 创建客户端接下来,我们需要创建一个WCF客户端,以便与服务进行通信。
ashx 调用wcf 用法Ashx调用WCF用法详解引言:在Web开发中,我们经常需要通过HTTP协议来调用远程服务。
提供了一种特殊的处理程序(HttpHandler)称为ASHX,用于处理一些定制化的HTTP请求。
本文将介绍如何使用ASHX来调用WCF服务,以及常见问题和解决方案。
一、WCF简介Windows通信基础(Windows Communication Foundation,简称WCF)是一种用于构建分布式应用程序的基于标准化的通信协议的平台。
WCF提供了一种简单、安全与高效的方法,使应用程序间可以通过网络进行通信。
二、ASHX简介ASHX是中一种特殊类型的处理程序,它允许我们更加灵活地处理和响应HTTP请求。
ASHX文件可以通过从System.Web.IHttpHandler 接口继承来创建,它允许我们自定义处理HTTP请求和相应操作。
三、ASHX调用WCF的步骤1. 创建WCF服务首先,我们需要创建一个WCF服务以供调用。
WCF服务可以使用Visual Studio的模板来创建。
在Visual Studio的菜单中,选择File -> New -> Project,然后在左侧模板栏中选择WCF,选择合适的模板创建服务。
2. 实现ASHX处理程序创建一个新的ASHX文件,继承IHttpHandler接口,并实现ProcessRequest和IsReusable方法。
csharppublic class MyHandler : IHttpHandler{public bool IsReusable => throw new NotImplementedException();public void ProcessRequest(HttpContext context){处理HTTP请求逻辑}}3. 调用WCF服务在ASHX处理程序中,我们需要实例化WCF服务的客户端,并调用合适的方法。
WCF项⽬中出现常见错误的解决⽅法:基础连接已经关闭:连接被意外关闭在我们开发WCF项⽬的时候,常常会碰到⼀些莫名其妙的错误,有时候如果根据它的错误提⽰信息,⼀般很难定位到具体的问题所在,⽽由于WCF服务的特殊性,调试起来也不是那么⽅便,因此往往会花费不少时间来进⾏跟踪处理。
本⽂介绍我在我在我的框架⾥⾯使⽤WCF 服务的时候,出现的⼀个常见错误的处理⽅法,它的提⽰信息是:基础连接已经关闭: 连接被意外关闭。
这种情况我碰到的有两种,⼀种是返回DataTable的时候出现的,⼀种是返回实体类类中带有枚举类型的情况,下⾯分别对它们的处理进⾏介绍。
1、DataTable返回值出现错误⼀般情况下,我们在设计WCF接⼝返回值的时候,都使⽤实体类或者实体类列表这种⽅式,但是有时候也可能需要返回⼀个DataTable的数据类型,如果按照下⾯的⽅式构造函数内容并返回,就可能出现错误。
定义接⼝///<summary>///根据查询条件,返回记录到DataTable集合中///</summary>///<param name="condition">查询条件</param>///<param name="pagerInfo">分页条件</param>///<returns></returns>[OperationContract]DataTable FindToDataTableWithPager(string condition, ref PagerInfo pagerInfo);实现函数,为了⽅便演⽰,填写了简单的测试代码。
///<summary>///根据条件查询数据库,并返回对象集合(⽤于分页数据显⽰)///</summary>///<param name="condition">查询的条件</param>///<param name="info">分页实体</param>///<returns>指定对象的集合</returns>public DataTable FindToDataTableWithPager(string condition, ref PagerInfo pagerInfo){//测试代码DataTable dt = new DataTable();dt.Columns.Add("Test");for (int i = 0; i < 10; i++){dt.Rows.Add(new object[] { "Test" + i });}return dt;}测试的时候,会发现出现错误如果你按照它的提⽰,你可能搔破头⽪也不知道具体是哪⾥的问题,这个地⽅其实很有意思,就是因为序列号DataTable的时候,没有TableName导致的,如果把函数体的实现⾥⾯,为返回的DataTable对象的TableName属性赋值⼀个值就可以了。
WCF基本知识点整理1. 服务契约(Service Contract):WCF中的服务以服务契约的形式定义。
服务契约是一个接口,定义了服务所提供的操作。
每个操作都有一个输入和一个输出参数。
开发人员可以通过定义自己的服务契约来实现自定义的服务。
2. 数据契约(Data Contract):WCF中的数据传输使用数据契约来定义。
数据契约是一个类或结构体,定义了要在服务和客户端之间传输的数据类型。
数据契约可以通过定义属性来描述数据的结构和属性。
3. 绑定(Binding):WCF中的绑定定义了服务与客户端之间的通信方式。
绑定可以指定传输协议、数据编码方式、安全性等。
WCF提供了多种默认的绑定,开发人员也可以自定义绑定来满足自己的需求。
4. 传输(Transport):WCF支持多种传输协议,如HTTP、TCP、MSMQ等。
开发人员可以根据需求选择适合的传输协议。
5. 消息(Message):WCF中的通信是通过消息来进行的。
消息是服务和客户端之间传输的基本单位,可以包含头部和正文。
开发人员可以通过定义自己的消息来实现自定义的通信协议。
6. 终结点(Endpoint):WCF中的终结点定义了服务的地址、绑定和契约。
终结点由地址和契约唯一确定。
客户端通过终结点与服务进行通信。
7. 客户端代理(Client Proxy):客户端通过代理类与服务进行通信。
客户端代理是通过WCF工具自动生成的,它封装了与服务之间的通信细节,开发人员可以通过客户端代理来调用服务的操作。
8. 服务宿主(Service Host):服务宿主是承载WCF服务的应用程序。
服务宿主负责启动服务、接受客户端请求,并将请求路由到相应的服务端点。
9. 错误处理(Error Handling):WCF提供了丰富的错误处理机制,开发人员可以通过异常处理来处理服务中的错误。
WCF还可以通过配置来定义错误处理策略,如故障转移、重试等。
10. 安全性(Security):WCF提供了多种安全性机制,如消息加密、身份验证、权限控制等。
一、分布式分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
分布式网络存储技术是将数据分散的存储于多台独立的机器设备上。
分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。
二、面向服务的体系结构(Service-Oriented Architecture,SOA)SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。
接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。
这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。
面向服务的体系结构传统的面向对象的模型的替代模型,面向对象的模型是紧耦合的,现在的SOA 已经有所不同了,因为它依赖于一些更新的进展,这些进展是以可扩展标记语言(Extensible Markup Language,XML)为基础的。
通过使用基于XML 的语言(Web 服务描述语言[Web Services Definition Language,WSDL])来描述接口,服务已经转到更动态且更灵活的接口系统中。
面向服务的体系结构作用:对SOA 的需要来源于需要使业务IT 系统变得更加灵活,以适应业务中的改变。
通过允许强定义的关系和依然灵活的特定实现,IT 系统既可以利用现有系统的功能,又可以准备在以后做一些改变来满足它们之间交互的需要。
对于面向同步和异步应用的,基于请求/响应模式的分布式计算来说,SOA是一场革命。
一个应用程序的业务逻辑(business logic)或某些单独的功能被模块化并作为服务呈现客户端。
例如,服务的接口和实现相独立。
我的W CF之旅(2):Endpoint OverviewWCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信。
使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现通信相关的问题,更加关注与系统的业务逻辑本身。
而在WCF Infrastructure中,各个Application之间的通信是由Endpoint来实现的。
Endpoint的结构Endpoint包含以下4个对象:∙Address: Address通过一个URI唯一地标识一个Endpoint,并告诉潜在的WCF service的调用者如何找到这个Endpoint。
所以Address解决了Where to locate the WCF Service?∙Binding: Binding实现在Client和Service通信的所有底层细节。
比如Client与Service之间传递的Message是如何编码的——text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Nam ed Pipe, MSMQ; 以及采用怎样的机制解决Secu re Messaging的问题——SSL,Message Level Security。
所以Binding解决的是How t o communicate with service?∙Contract: Contract的主要的作用是暴露某个WCF Service所提供的所有有效的Functiona lity。
从Message Exchange的层面上讲,Contract实际上是抱每个Operation转化成为相对应的Message Exchange Pattern——MEP(Request/Response;One-way;Duple x)。
所以Contract解决的是What functionalities do the Service provide?∙ Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。
比如S ervice 回调Client的Timeout;Client采用的Credential type;以及是否支持Transactio n等。
当我们Host一个WCF Service的时候,我们必须给他定义一个或多个Endpoint,然后ser vice通过这个定义的Endpoint进行监听来自Client端的请求。
当我们的Application需要调用这个Service的时候,因为Client 和Service是通过Endpoint的进行通信的,所以我们必须为我们的Application定义Client端的Endpoint。
只有当Client的Endpoint和Servi ce端某个Endpoint相互匹配(Service端可以为一个Service定义多个Endpoint),Clien t端的请求才能被Service端监听到。
也就是说,我们只有在Client具有一个与Service端完全匹配的Endpoint,我们才能调用这个Service。
而这种匹配是比较严格的,比如从匹配Add ress方面,Client端和Service端的Endpoint Address不仅仅在URI上要完全匹配Servi ce,他们的Headers也需要相互匹配。
对于Binding, 一般地,Client需要有一个与Servic e端完全一样的Binding,他们之间才能通信。
Sample首先给一个Sample,以便我们对在WCF Service Aplication中如何定义Endpoint有一个感性的认识。
整个Solution的结构参照下图,我的上一篇Blog([原创]我的WCF之旅(1):创建一个简单的WCF程序)中有详细的介绍。
你也可以通过后面的Link下载相应的Source Code(/files/artech/Artec h.WCFService.zip )1. Service Contract:Artech..WC fService.Contract/ServiceContract/IGen eralCalculator.csusing System;using System.Collections.Generic;using System.Text;using System.ServiceModel;nam espace Artech.WCFService.Contract{[ServiceContract]public interface IGeneralCalculator{[OperationContract]double Add(double x, double y);}}2. Service: Artech.WCFSerice.Service/GeneralCalculatorService.csusing System;using System.Collections.Generic;using System.Text;using Artech.WCFService.Contract;nam espace Artech.WCFService.Service{public class GeneralCalculatorService:IGeneralCalculator{IGeneralCalculator Members}}3. Hosting: Artech.WCFService.Hosting/Program.csusing System;using System.Collections.Generic;using System.Text;using System.ServiceModel;using Artech.WCFService.Contract;using Artech.WCFService.Service;using System.ServiceModel.Description;nam espace Artech.WCFService.Hosting{class Program{static void Main(string[] args){//HostCalculatorServiceViaCode();HostCalculatorSerivceViaConfiguration();}///<summary>/// Hosting a service using managed code without any configuraiton infor mation./// Please note that the related configuration data should be removed befo re calling the m ethod.///</summary>static void HostCalculatorServiceViaCode(){Uri httpBaseAddress =new Uri("http://localhost:8888/generalCalculato r");Uri tcpBaseAddress =new Uri("net.tcp://localhost:9999/generalCalculator");using (ServiceHost calculatorSerivceHost =new ServiceHost(typeof(Ge neralCalculatorService), httpBaseAddress, tcpBaseAddress)){BasicHttpBinding httpBinding =new BasicHttpBinding();NetTcpBinding tcpBinding =new NetTcpBinding();calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculato r), httpBinding, string.Empty);calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculato r), tcpBinding, string.Empty);ServiceMetadataBehavior behavior = calculatorSerivceHost.Descripti on.Behaviors.Find<ServiceMetadataBehavior>();{if(behavior ==null){behavior =new ServiceMetadataBehavior();behavior.HttpGetEnabled =true;calculatorSerivceHost.Description.Behaviors.Add(behavior);}else{behavior.HttpGetEnabled =true;}}calculatorSerivceHost.Opened += delegate{Console.WriteLine("Calculator Service has begun to listen "); };calculatorSerivceHost.Open();Console.Read();}}static void HostCalculatorSerivceViaConfiguration(){using (ServiceHost calculatorSerivceHost =new ServiceHost(typeof(Ge neralCalculatorService))){calculatorSerivceHost.Opened += delegate{Console.WriteLine("Calculator Service has begun to listen "); };calculatorSerivceHost.Open();Console.Read();}}}}4. Service.svc: http://localhost/WCFService/ GeneralCalculatorService. svc<%@ ServiceHost Language="C#" Debug="t rue" Service="Artech.WCFService. Service.GeneralCalculatorService" %>5. Client: Artech.WCFService.Client/ GeneralCalculatorClient.cs & Progr am.csusing System;using System.Collections.Generic;using System.Text;using System.ServiceModel;using System.ServiceModel.Channels;using Artech.WCFService.Contract;nam espace Artech.WCFService.Client{class GeneralCalculatorClient:Client Base<IGeneralCalculator>,IGeneralCalcul ator{public GeneralCalculatorClient(): base(){ }public GeneralCalculatorClient(string endpointConfigurationName): base(endpointConfigurationName){ }public GeneralCalculatorClient(Binding binding, EndpointAddress address): base(binding, address){ }IGeneralCalculator Members}}using System;using System.Collections.Generic;using System.Text;using System.ServiceModel;using System.ServiceModel.Channels;using Artech.WCFService.Contract;nam espace Artech.WCFService.Client{class Program{static void Main(){try{//InvocateCalclatorServiceViaCode();InvocateCalclatorServiceViaConfiguration(); }catch (Exception ex){Console.WriteLine(ex.Message);}Console.Read();}static void InvocateCalclatorServiceViaCode(){Binding httpBinding =new BasicHttpBinding();Binding tcpBinding = new NetTcpBinding();EndpointAddress httpAddress =new EndpointAddress("http://localhost: 8888/generalCalculator");EndpointAddress tcpAddress =new EndpointAddress("net.tcp://localhos t:9999/generalCalculator");EndpointAddress httpAddress_iisHost =new EndpointAddress("http://lo calhost/wcfservice/GeneralCalculatorService.svc");Console.WriteLine("Invocate self-host calculator service ");Invocate Self-host serviceConsole.WriteLine("\n\nInvocate IIS-host cal culator service ");Invocate IIS-host service}static void InvocateCalclatorServiceViaConfiguration(){Console.WriteLine("Invocate self-host calculator service ");Invocate Self-host serviceConsole.WriteLine("\n\nInvocate IIS-host cal culator service ");Invocate IIS-host service}}}<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><behaviors><serviceBehaviors><behavior name="calculatorServieBehavior"><serviceMetadata httpGetEnabled="true"/></behavior></serviceBehaviors></behaviors><services><service behaviorConfiguration="calculatorServieBehavior" name="Art ech.WCFService.Service.GeneralCalculatorService"><endpoint address="" binding="basicHttpBinding" contract="Artech. WCFService.Contract.IGeneralCalculator"></endpoint><endpoint address="" binding="netTcpBinding" contract="Artech.W CFService.Contract.IGeneralCalculator"/><host><baseAddresses><add baseAddress="http://localhost:8888/generalcalculator"/><add baseAddress="net.tcp://localhost:9999/generalCalculator "/></baseAddresses></host></service></services></system.serviceModel></configuration>7. IIS-Host Configuration:<?xml version="1.0"?><configuration xmlns="http://schem /.NetConfiguration/v2.0"> <system.serviceModel><behaviors><serviceBehaviors><behavior name="calculatorServiceBehavior"><serviceMetadata httpGetEnabled ="true"></serviceMetadata></behavior></serviceBehaviors></behaviors><services><service nam e="Artech.WCFService.Service.GeneralCalculatorService" beh aviorConfiguration="calculatorServiceBehavior"><endpoint binding="basicHttpBinding" contract="Artech.WCFService.Contr act.IGeneralCalculator"></endpoint></service></services></system.serviceModel><system.web><compilation debug="t rue"><assemblies><add assem bly="System.Security, Version=2.0.0.0, Culture=neutra l, Public KeyToken=B03F5F7F11D50A3A"/><add assem bly="Microsoft.Transactions.Bridge, Version=3.0.0.0, Cul ture=neutral, Public KeyToken=B03F5F7F11D50A3A"/><add assem bly="SMDiagnostics, Version=3.0.0.0, Culture=neutra l, Public KeyToken=B77A5C561934E089"/><add assem bly="System.IdentityModel.Selectors, Version=3.0.0. 0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/><add assem bly="System.DirectoryServices, Version=2.0.0.0, Cultur e=neutral, PublicKeyToken=B03F5F7F11D50A3A"/><add assem bly="System.Web.RegularExpressions, Version=2.0.0. 0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/><add assem bly="System.Transactions, Version=2.0.0.0, Culture=ne utral, PublicKeyToken=B77A5C561934E089"/><add assem bly="System.Messaging, Version=2.0.0.0, Culture=neut ral, PublicKeyToken=B03F5F7F11D50A3A"/><add assem bly="System.ServiceProcess, Version=2.0.0.0, Culture= neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies></com pilation> </system.web></configuration>8. Client configuration: Artech.WCFService.Client/App.config<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><client><endpoint address="http://localhost:8888/generalCalculator" binding="basic HttpBinding" contract="Artech.WCFService.Contract.IGeneralCalculator" name="s elfHostEndpoint_http"/><endpoint address="net.tcp://localhost:9999/generalCalculator" binding=" netTcpBinding" contract="Artech.WCFService.Contract.IGeneralCalculator" name ="selfHostEndpoint_tcp"/><endpoint address="http://localhost/wcfservice/GeneralCalculatorService.s vc" binding="basicHttpBinding" contract="Artech.WCFService.Contract.IGeneralC alculator" name="iisHostEndpoint"/></client></system.serviceModel></configuration>如何在Application中定义Endpoint对于Self-Host的Service,绝大部分的Endpoint相关的信息都具有两种定义方式——Mana ged Code 和Configuration。