我的WCF之旅(2)Endpoint Overview

合集下载

WCF学习——终结点(Endpoint)

WCF学习——终结点(Endpoint)

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) 地址不同的侦听地址。

WCF教程2

WCF教程2

static void HostCalculatorSerivceViaConfiguration() { using (ServiceHost calculatorSerivceHost = new ServiceHost(typeof(Ge neralCalculatorService))) { calculatorSerivceHost.Opened += delegate { Console.WriteLine("Calculator Service has begun to listen }; ");
using (ServiceHost calc ulatorSerivceHost = new ServiceHost(typeof(Ge neralCalculatorService), httpBaseAddress, tcpBaseAddress)) { BasicHttpBinding httpBinding = new BasicHttpBinding(); NetTcpBinding tcpBinding = new NetTc pBinding();
calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculator ), httpBinding, string.Empty); calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculator ), tcpBinding, string.Empty);
calculatorSerivceHost.Opened += delegate {
ቤተ መጻሕፍቲ ባይዱ
Console.WriteLine("Calculator Service has begun to listen };

我的WCF之旅(1):创建一个简单的WCF程序

我的WCF之旅(1):创建一个简单的WCF程序

/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万圣节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):决战紫禁之巅

WCF从理论到实践(2):决战紫禁之巅

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 实例架构例子

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教程首先,让我们了解WCF的核心概念。

WCF服务由三个主要组件构成:契约(Contract)、绑定(Binding)和终结点(Endpoint)。

契约定义了服务要提供的操作和数据类型。

绑定定义了服务与客户端之间的通信方式。

终结点定义了网络地址和协议,用于访问服务。

在WCF中,契约定义了服务的操作和数据类型。

它们可以是简单的方法调用,也可以是消息传递。

契约可以分为服务契约和数据契约。

服务契约包含操作契约和消息契约,操作契约定义了服务要提供的操作,消息契约定义了操作契约的输入和输出消息的报文格式。

数据契约定义了在服务和客户端之间传输的数据类型。

绑定定义了服务与客户端之间的通信方式。

WCF提供了多种不同的绑定选项,可以选择适合应用程序需求的绑定类型。

常见的绑定类型包括基本绑定、TCP绑定、HTTP绑定等。

终结点定义了服务的网络地址和协议,用于访问服务。

WCF支持多种不同的终结点类型,包括基本终结点、TCP终结点、HTTP终结点等。

每个终结点可以指定一个绑定和一个契约。

现在,让我们开始创建第一个WCF服务。

第一步是创建WCF服务项目。

打开Visual Studio,选择“新建项目”,然后选择“WCF服务应用程序”模板。

接下来,给项目起一个名称,并选择创建的位置。

点击确定开始创建项目。

创建了WCF服务项目后,我们需要定义一个契约。

在项目中添加一个新的接口文件,然后在接口中定义服务的操作和数据类型。

例如,我们可以定义一个简单的计算器服务,包含添加和乘法操作。

接下来,我们需要实现契约中定义的操作。

在项目中添加一个新的类文件,并实现接口中定义的操作。

在实现操作时,我们可以使用C#或其他语言来编写逻辑。

接下来是配置WCF服务。

在项目中添加一个新的配置文件,然后在文件中定义服务的终结点和绑定。

我们可以选择使用哪种协议和地址来访问服务。

在配置完成后,我们可以运行WCF服务。

运行服务后,会在本地启动一个宿主进程,等待客户端的请求。

WCF开发日志 -- WCF启动多个服务

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 要不然系统不会启动新增加的服务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我的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。

相关文档
最新文档