WCF是构建和运行互联系统的一系列技术的总称,它是建立在Web Service架构上的一个全新的通信平台。你可以把它看成是.NET平台上的新一代的Web Service。WCF为我们提供了安全、可靠的的消息通信,也为我们提供了更好的可互操作性是的我们可以和其他的平台进行“交流”。
微软斥巨资打造WCF,在我们看来主要出于下面两个目的:实现其对现有的分布式技术的整合以及顺应SOA的浪潮。在WCF之前,微软已经为了提供了一套完整的基于分布式的技术和产品,这些技术和产品使我们构建一个基于于分布式的互联系统变得异常简单。我们熟悉的技术包括Enterprise Service,.NET Remoting, XML Web Service, MSMQ等等,这些不同的技术和产品为相同的功能提供了不同的实现。对于技术的发展,我觉得“统一”是一个主线:为了让基于Web的开发可以采用我们基于Windows Form的事件驱动、基于控件开发模式,我们有了ASP.NET;为了使具有不同结构的数据(.NET Object, XML, Relational Data etc)采用相同的操作方式,我们有了LINQ。同样,对于一个分布式系统的开发,将不同的分布式技术整合起来,提供一个统一的编程模型是绝对有必要的,WCF就是基于这样的一个目的发展起来的。
但是,如果你认为WCF仅仅是这些不同的分布式技术简单地组合在一起,那就错了。WCF在对这些技术进行整合的时候,始终有一个指导方针,那就是SOA。SOA,毫无疑问是今后开发互联系统的一个趋势,对于SOA,我想网上充斥着太多的相关的信息,我在这里就不做任何介绍了。SOA的发展离不开一个大家能够一致尊崇的一个标准,而WS-* 就是这个标准。WCF基本上实现了目前所有的WS-* 标准。
在过去半年之后,我陆陆续续写了一些关于WCF介绍的一些文章,我把它命名为“我的WCF之旅”,目的在于向大家分享我学习WCF这一段旅程。现在把把这个系列做一个阶段性的总结,以飨读者。
[第1篇] 创建一个简单的WCF程序
在Microsoft提出.NET战略以来,先后推出了一系列产品和技术,这些产品和技术为我们在.NET平台下建立企业级的分布式应用提供了很大的 便利。这些技术和产品包括:.NET Remoting,XML WebSerivce,WSE(2.0,3.0),Enterprise Service, MSMQ 等等。通过合理利用上面这些分布式的技术完全可以为我们建立的一套适合不同层次需要的分布式构架。但这里面仍然存在一些问题,那就是上面这些技术和产品只能解决某一方面的问题;比如.NET Remoting虽然在.NET平台下是一个很好的依靠,但是考虑到他不能提供不同平台之间的互操作性。另外,这些技术适合用了完全不同的编程方式,使得我们很难从容地从其中一种转移到另一种上来。基于这些原因, 我们需要一套全新的技术整合以上都这些技术,于是我们有了今天的WCF—— Windows Communication Foundation。WCF建立一套框架,是我们通过一致的编程模式,使用不同的技术构建我们的分布式应用。
虽然很早开始接触WCF,但所学的总是零零碎碎。现在开始系统地研究WCF,希望与大家一同分享我的一些所得, 同时希望能通过这样的一个机会与大家一些探讨WCF,不对的地方希望大家指正。
一开始我们先建立一个简单程序看WCF如何工作。
[第2篇] Endpoint Overview
WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信。使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现通信相关的问题,更加关注与系统的业务逻辑本身。而在WCF Infrastructure中,各个Application之间的通信是由Endpoint来实现的。
当我们Host一个WCF Service的时候,我们必须给他定义一个或多个Endpoint,然后service通过这个定义的Endpoint进行监听来自Client端的请求。当我们的Application需要调用这个Service的时候,因为Client 和Service是通过Endpoint的进行通信的,所以我们必须为我们的Application定义Client端的Endpoint。只有当 Client的Endpoint和Service端某个 Endpoint相互匹配(Service端可以为一个Service定义多个Endpoint),Client端的请求才能被Service端监听到。也就是说,我们只有在Client具有一个与Service端完全匹配的Endpoint,我们才能调用这个Service。而这种匹配是比较严格的,比如从匹配Address方面,Client端和Service端的Endpoint Address不仅仅在URI上要完全匹配Service,他们的Headers也需要相互匹配。对于Binding, 一般地,Client需要有一个与Service端完全一样的Binding,他们之间才能通信。
[第3篇] 在WCF中实现双向通信(Bi-directional Communication)
作为Remoting中实现双向通信对比,来讨论一下WCF的双向通信。为了使我们能够更好地对比双向通信在 Remoting中和WCF中的实现,我们的Sample采用一样的业务逻辑——调用一个数学计算的远程调用,除了传递相应的操作数之外,我们还传递一个对象,这个对象可以在Server端中回调 (Callback) 把运算结果在Client端显示出来。
[第4篇] WCF中的序列化(Serialization)
在分布式系统中,一个Application与另一个Application之间进行交互,必然需要携带数据。系统交互完全是应 Message的方式进行的,Message是XML,当然置于Message中的数据也应该是XML(XML Infoset)。如何处理这些交互的数据,我们可能首先想到的就是直接处理XML,我们可以在XML级别通过相关的XML技术——XSD,XPath, XSLT来操作数据。但是要使我们处理后的XML需要和要求的完全一致,这样的工作无疑是非常枯燥乏味而且费时费力的。而我们最擅长的就是使用.NET对象来封装我们的数据。如何使我们创造的对象能够有效地转化成结构化的XML Infoset,就是今天我们要讲的内容——Serialization。
[第5篇] 面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
给予XML的WCF,并不具有对Overloading的原生支持,但是Overloading是.NET Framework原生支持的。通过Overloading,我们可以使用同名的方法来定义不同的操作,从而使我们的Code显得更加优雅(Elegant)。要是Overloading在WCF中可以使用,WCF必须提供这样的一个Mapping——是被重载的具有相同方法的的方法 Mapping到不同的Operation上。而提供着一个功能的就是ServiceContract。下面我们来结合一个Sample来看如何在WCF 中使用Overloading。
[第6篇] 在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案
针对一个读者将我的demo从Console Application移植到Windows Form而出现TimeoutException,进一步了解WCF的Messaging。
[第7篇] 面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承
而在编程模型层面,OO仍然是不可替代的编程模式。所以OO应用于Programming,而SO则更多地运用在Architecture。既然是这样,我们必须有一种调和剂来调和这两个运用不同原理的两个层面的差异,实现他们之间的无缝的结合。比如如何来对继承,多态,重载等基于OO行为的支持。在这方面,WCF为我们提供了很好的解决方案。所以我说WCF不但是为基于SOA的应用架构提供了技术支持,还通过相关的机制完成我们提出的这个“调和剂”的使命。
在这里我们通过一个Sample来讨论WCF对继承的支持。这个Sample中,我们通过一个WCF Service实现了提供天气信息的功能,或者说,我们实现了一个用作天气预报的WCF Service。
[第8篇] WCF中的Session和Instancing Management
在一个C/S(Client/Service)场景中,Context无关性体现在Client对Service的每次调用都是完全不相关的。但是在有些情况下,我们却希望系统为我们创建一个Session来保留某个Client和Service的进行交互的状态。所以,像Web Service一样,WCF也提供了对Session的支持。对于WCF来说,Client和Service之间的交互都通过Soap Message来实现的,每次交互的过程就是一次简单的Message Exchange。所以从Messaging的角度来讲,WCF的Session就是把某个把相关的Message Exchange纳入同一个Conversation。每个Session用一个Session ID来唯一标识。
真正的逻辑实现是通过调用真正的Service instance中。在一个分布式环境中,我们把通过Client的调用来创建最终的Service Instance的过程叫做Activation。在Remoting中我们有两种Activation方式:Server Activation(Singleton和SingleCall),Client Activation。实际上对WCF也具有相似的Activation。不过WCF不仅仅创建对应的Service Instance,而且还构建相关的Context, 我们把这些统称为Instance Context。不同的Activation方式在WCF中体现为的Instance context model。不同的Instance Context Mode体现为Proxy、Service 调用和Service Instance之间的对应关系。可以这么说,Instance Context Mode决定着不同的Session表现。
[第9篇] 如何在WCF中使用tcpTrace来进行Soap Trace
无论对于Web Service还是WCF,Client和Service之间交互的唯一形式是通过发送和接收Soap Message。在我们对Web Service和WCF进行深入学习的时候,借助一些Soap Trace 工具对Soap Message进行深入剖析是非常有必要的。在这些工具之中,我觉得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace。我们今天就来讲讲如何在WCF中使用tcpTrace这个工具。
[第10篇] 如何在WCF进行Exception Handling
在任何Application的开发中,对不可预知的异常进行troubleshooting时,异常处理显得尤为重要。对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地实现这一功能。但是对于一个分布式的环境来说,异常处理就没有那么简单了。按照面向服务的原则,我们把一些可复用的业务逻辑以Service的形式实现,各个Service处于一个自治的环境中,一个Service需要和另一个Service进行交互,只需要获得该Service的描述(Description)就可以了(比如 WSDL,Schema和Strategy)。借助标准的、平台无关的通信构架,各个Service之间通过标准的Soap Message进行交互。Service Description、Standard Communication Infrastructure、Soap Message based Communication促使各Service以松耦合的方式结合在一起。但是由于各个Service是自治的,如果一个Service调用另一个 Service,在服务提供方抛出的Exception必须被封装在Soap Message中,方能被处于另一方的服务的使用者获得、从而进行合理的处理。下面我们结合一个简单的Sample来简单地介绍我们可以通过哪些方式在 WCF中进行Exception Handling。
[第11篇] 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
在一个基于面向服务的分布式环境中,借助一个标准的、平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互。这个交互的过程实际上就是Message Exchange的过程。WCF支持不同形式的Message Exchange,我们把这称之为Message Exchange Pattern(MEP), 常见的MEP包括: Request/Reply,Request/Forget(One-way)和Duplex。通过采用Duplex MEP,我们可以实现在Service端Callback Client的操作。虽然WCF为我们实现底层的通信细节,使得我们把精力转移到业务逻辑的实现,进行Transport无关的编程,但是对底层 Transport的理解有利于我们根据所处的具体环境选择一个合适的Transport。说到Transport, WCF 经常使用的是以下4个:Http,TCP,Named Pipe,MSMQ。由于不同协议自身的差异,他们对具体MEP的支持方式也会不同,我们今天就来谈谈Http和TCP对Duplex的支持。
[第12篇] 使用MSMQ进行Reliable Messaging
在一个分布式的环境中,我们往往需要根据具体的情况采用不同的方式进行数据的传输。比如在一个Intranet内,我们一般通过TCP进行高效的数据通信;而在一个Internet的环境中,我们则通常使用Http进行跨平台的数据交换。而这些通信方式具有一个显著的特点,那就是他们是基于 Connection的,也就是说,交互双方在进行通信的时候必须保证有一个可用的Connection存在于他们之间。而在某些时候,比如那些使用拨号连接的用户、以及使用便携式计算机的用户,我们不能保证在他们和需要访问的Server之间有一个的可靠的连接,在这种情况下,基于Messaging Queue的连接就显得尤为重要了。我们今天就来谈谈在WCF中如何使用MSMQ。
[第13篇] 创建基于MSMQ的Responsive Service
我们知道MSMQ天生就具有异步的特性,它只能以One-way的MEP(Message Exchange Pattern)进行通信。Client和Service之间采用One-way MEP的话就意味着Client调用Service之后立即返回,它无法获得Service的执行结果,也无法捕捉Service运行的 Exception。
但是在有些场景 中,这是无法容忍的。再拿我在上一篇文章的Order Delivery的例子来说。Client向Service提交了Order,却无法确认该Order是否被Service正确处理,这显然是不能接受的。我们今天就来讨论一下,如何创建一个Responsive Service来解决这个问题:Client不再是对Service的执行情况一无所知,它可以获知Order是否被Service正确处理了。
posted @ 2007-09-15 13:01
Artech 阅读(59240)
评论(106) 编辑 收藏
发表评论
您的和Bruce Zhang 的 WCF都不错。。。Bruce Zhang 的文采很好。但写的没有您这么有连续性。还是看你的学到了很多东西。。
对了 忘记问 Artech一件事情 我的vs2008b2的wcf生成工具生成出错。。我说强类型版本有问题? 怎么解决??
Mail guohao0826@126.com
我学习WCF的第一手资料,呵呵,已经加入CLR团队公告,不知Artech兄可以登陆管理添加吗?我先给你加上:-)
我们的努力不会白费,呵呵。
@sunnyWCF
还没有用过VS 2008 beta的生成工具呢:)
@Artech
呵呵,那就好,团队或者博客中如果有合适的精品系列,在征得同意后,望Artech兄自行添加至团队公告,呵呵,谢了。团队的管理离不开你的鼎力支持。
wcf 全面实现了ws 规范。
但不能说wcf 是新一代的 web service
先谢谢楼主^_^
顺便问下,有没有通过WCF传文件的例子?例如:从Client上传一个文件到寄宿在IIS的WCF(使用BasicHttpBind绑定方式),thanks:)
@Silent Void
没有做过这方面的尝试,凭我的第一感觉使用BasicHttpBind这不是一个好方法,这种涉及大数据量的传输,使用Per-to-Per方式更好,你可以在MSDN上参阅有关Per-to-Per Networking方面的内容。
@Artech
回复得真快,谢谢^_^
不要意思,我可能没有表述清楚,我不是想用WCF来实现纯粹的文件/大文件传输任务。
我现在做的一个项目,使用了WCF实现Client到Server的通讯,其中有个功能是要从Client传小文件(图片文件)到Server上保存,以后部署的时候,WCF的宿主进程(IIS)要部署在防火墙后面,不能用P2P来传文件。
我现在的思路是把整个文件读到Byte[]中再传,但感觉不太好,不知道有没有其他方法?谢谢:)
搜索一下有关MTOM的资料,WSE3.0已经开始提供了对它的支持。
@Silent Void
针对这个问题在WCF中有两种解决方案:
1、idior所说的通过MTOM对文件内容进行编码,你需要在配置文件中对应的Binding configuration section设置 messageEncoding="Mtom"
2、直接采用Stream的方式。
你可以通过我上面给你Link找到详细的介绍。希望能解决你的问题!
--引用--------------------------------------------------
阿勇: wcf 全面实现了ws 规范。
但不能说wcf 是新一代的 web service
--------------------------------------------------------
我之所以将WCF称为MS .NET 平台下的新一代的Web Service(实际上在很多书籍、资料上也有这样的提法),主要基于这样的原因:SOA越来越深入人心,而在不同的平台上实现SOA的核心技术为都叫做Web Service。在对于MS .NET 平台来说,传统的asmx Web Service会逐渐被WCF取代,所以很多人将WCF称作新一代的Web Service,尽管WCF比传统的Web Service和其他平台下的Web Service要强大的多。
@idior & @Artech
Thank you ^_^
暂时先用Stream来实现了图片文件的上传,回头有时间的话再看看MTOM; 谢谢两位!
@Silent Void
使用Stream的时候会有一些限制,比如只能是为一个的参数,实现的时候要考虑到这些限制!
@Artech
nod,我用将其它参数和stream封装在一个类中,然后应用MessageContract,将其它参数放在MessageHeader中。这里不能用DataContract.
thanks.
@gujiliuxing
最近事情比较多,接下来会补上!
求教:我用wcf 做的项目,其中有一个方法是从client 传输据到server ;bindinglist<dc> 的方式传输。当list 是60 条记录时,调用保存方法是没有问题。当list 是360(也就是数据量大时)时就抱错了;怎么解决
@虫子congch_qm@faw.com.cn
试试改下maxReceivedMessageSize,默认只有64K(65536)
@Silent Void
对于SSL在WCF中的运用,还没有深入研究过。
我的开发环境是vs2008;
用iis来发布wcf service的时候,老是不成功,是什么问题?
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost/SysService" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="NewBehavior" name="Rg.Common.Service.Sys">
<endpoint address="http://localhost/SysService" binding="basicHttpBinding"
bindingConfiguration="" contract="Rg.Common.Contract.ISys" />
</service>
</services>
</system.serviceModel>
未处理的异常: System.InvalidOperationException: ServiceMetadataBehavior 的 Http
GetEnabled 属性设置为 True,而 HttpGetUrl 属性是相对地址,但没有 http 基址。请提
供 http 基址或将 HttpGetUrl 设置为绝对地址。
@小菲
你两条留言说的是同一个问题吗,如果是的话,Configuration是不对的。如果你将WCF Service Host在IIS中,是不需要设置任何Address 相关的信息的,因为Address使用的是svc文件所在的虚拟目录地址。
楼主,请问一下, 能不能在service端得到调用service的client的address?
@小飞刀
可以参考WCF的双向通信!Client在调用Service的时候,指定一个Address来监听Service的Callback。
请教一下lz,如果想用WCF来进行文件的下载,考虑到文件可能比较大,怎么比较方便的实现断点续传的效果(分段下载)?
我当前的实现很龌龊,客户端传了一个文件名,服务器端根据文件名找到文件,把文件流化到一个byte[]里面,然后回传客户端。
目前我能想到的支持续传的方案有:
客户端在下载文件之前,先访问一次服务器,获得文件的大小。比如如果文件总共是10M,那我就做一个循环,每次下载1M。这样的坏处是要建立10次连接,而且到底把文件分为多大的块很难决定(跟每个客户端的网络状况有关)。
总感觉WCF对这方面应该有直接的支持,但我用得比较弱,还望Artech指教一下
或者这类的操作本来就不适合用WCF来做,用socket编程来实现对传输流的更强的控制?
@EagleFish
大文件下载用WCF来做似乎不大好吧,毕竟把文件如入到内存,对于Server也是一种压力,而且下载到Client也是先到内存,再到disk,有点遥远路的感觉。
这种东西如果想要简单快速的实现,还要有断点续传,最好试试Microsoft的BITS服务,Windows的Update就使用那个来实现的
@EagleFish
使用WCF作为这样的场景不多见,可以参考一下如何在WCF使用Per-to-Per,不过这个我不太熟悉^_^
多谢楼主这个系列,今天是全部看完了!也算是对WCF有一定的理解了,感谢楼主!不知楼主还会不会写一些有关WCF比较大的例子呢?能够帮助深入理解WCF!在此再次感谢楼主!
@ThinkingWang
等这阵子忙过去了, 我会继续的^_^
我全看了,你是继Bruce Zhang之后我喜欢的第二个人,谢谢了,向你们学习,向你们致敬
@王伶
Thanks & Merry Christmas^_^
<div style="display:None">
如果需要稍微大的数据传输,修改maxReceivedMessageSize ,只需要在server端中设置就OK,还是Client也要设置?
我在两台机子上进行WCF通信,可是出现了异常:"调用方未由服务进行身份验证",请问应当如何解决?
请问楼主如何解决WCF服务权限的问题呀。我的服务程序别人随便就可以使用我的封装类去创建对象,然后通过服务调用程序呀。
<client>
<endpoint >
.
.
.
<identity>
<userPrincipalName value="WXWINTER\Administrator" />
</identity>
</endpoint>
</client>
如果客户端要使用这样的权限才能访问,那服务端的配置文件应该加什么判断呀?
强烈建议博主将此文章推荐,每次都要进来翻好长时间.
--引用--------------------------------------------------
Clingingboy: 非常感谢Artech.确实写的非常好.
:)
--------------------------------------------------------
谢谢对本系列的支持!
@Artech
新年快乐,非常感谢Artech大哥,让我们不用再在WCF苦海苦苦挣扎!
问个问题:我们常见的是从客户端访问WCF服务,能从WCF服务访问WCF服务吗(有Callback)? 因为我的项目里写了两层服务,上一层给外界调用,同时通过下一层服务实现设备控制,所以存在服务调用服务的问题,能给些讲解或是告知一点资料吗?
再一次祝您新年万事顺心!!
@Artech
谢谢您的回复,我想问的不是Callback,我的意思是在一个Service里调用另外一个Service,也就是说有两个服务分别在两个host中,从其中一个host的服务访问另一个host里的服务,而不是从Client访问Server,您明白我的意思吗??这方面怎么做呢??
楼主你好:
用心拜读你的文章,每次都有收获。
想请教一个问题,或关于这方面的解决方案最好给个专题:
1、如果我只是想通过用户名和密码验证,不用考虑传输过程中的信息加密,是不是也就不用X.509证书来处理加密信息了。
2、如果使用WCF授权必须使用X.509证书的话,证书必须需要花钱申请吗?能不能用VS的工具生成的?
谢谢你在百忙中能给回答一下。
--引用--------------------------------------------------
xwdd: @Artech
谢谢您的回复,我想问的不是Callback,我的意思是在一个Service里调用另外一个Service,也就是说有两个服务分别在两个host中,从其中一个host的服务访问另一个host里的服务,而不是从Client访问Server,您明白我的意思吗??这方面怎么做呢??
--------------------------------------------------------
这种情况下, 第一个Service的实现相当于第二个Service的Client,正常调用Service就可以了·
设置一下安全模式为none也无效,后来我设置为
<security mode="Message">
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
这样本机\局域网都OK了,但是广域网还是不行???谁知道呀,帮帮忙
--引用--------------------------------------------------
肥仔鱼: 设置一下安全模式为none也无效,后来我设置为
<security mode="Message">
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
这样本机\局域网都OK了,但是广域网还是不行???谁知道呀,帮帮忙
--------------------------------------------------------
Windows Credential怎么能适用于WAN呢?
强烈感谢Artech大哥,这个系列的文章是我学习WCF的启蒙教程呢~~ 呵呵~~
今天第二次通览了这些文章,和第一次相比感觉大不一样呢~~
老大,您的大作wcf技术剖析第二卷啥时候出,很期待
写书毕竟是副业,只能利用工作之余的时间,所以进度只能依赖工作安排了!
呵呵,年前可以出来不,卷一写的非常好,个人认为是目前看到过的介绍最详细的一本WCF书了,非常好,一直对WCF安全,事务之类的比较模糊,期待第二卷呀
这个可能比较困难,卷2的内容相对比较“深入”,需要查阅很多相关资料,可能写作周期要比卷1要长!
今天一看楼主的相片,发现和以前不一样啊。而且太不一样。
关于soa一直有一个难题困扰着我,数据如何集成,举个例子,现在有一个客户信息的服务存在,拥有自己独立的数据库,我在一个订单管理的系统中使用这个服务,每个订单都会有一个客户的属性,当我保存后会将这个客户的编号存入到订单管理系统的本地数据库中,可是这样一来,当我查询订单时,如果我基于服务边界去获得客户属性查询就会很效率很低,比如查询10条订单,我就要10次去调用服务,如果采用分布式数据库查询,那么服务的底层就被暴露了,产生紧耦合,也就失去soa的意义了,我想请教一下,在这种情况下,通常是怎么解决的
松耦合和性能在很多情况下就是互相矛盾的,我只能说,如果对性能的要求很高的话可以采用
1、你说的分布试数据库查询;
2、通过批处理在两个数据库中进行同步;
3、如果客户信息不经常变化,可以考虑对客户端信息进行客户端缓存。
刚学习WCF,楼主的这个系列文章,对现在的我 ,很有帮助啊。。
最近在学习WCF相关的东西,非常感谢楼主这个系列的文章。
mark
感觉真的不错,想学WCF拜读完你的文章感觉就够用了
看过你的一系列博文,受益匪浅。
有两个问题,请不吝赐教:
1. 假如以下使用场景:
Service1提供Function1;
Service2提供Function2;
Function2包含Function1,这里想直接在Service2中调用Service1相关契约组合成Function2。
我尝试了在S2中引用S1,将S2作为S1的客户端来操作。这样后,生成的配置文件有点混乱,非常复杂。不知道还有没有其它的途径实现上述需求?
2. ICalculator那个SampleCode中,客户端是Console Application时,非常快的就返回了计算结果;当我建立Windows Application来调用Service时,第一次调用接口时,总是要无响应一会(目测2秒左右),之后的调用都是立刻就成功。不知道是什么原因导致WinApp第一次调用WCF时的停顿?有无解决方法?
以上问题,困惑了很久。由于看过你的所有博文和回复都没有人提及,所以感觉有点蹊跷,难道只有我才遇到这样的问题,我RP一向很好呀...
盼复,谢谢。
多谢了
在起初拜读您的文章感觉有点深,,勉强看了一遍....迷迷茫茫
但现在看来您的文章如此多彩
我想问一下,我写了一个wcf服务类库,然后发布到iis上 ,在ie上也能访问,但是我用aspx页面来调用这个服务的时候 出现了 这个情况:
通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ServiceModel.CommunicationObjectFaultedException: 通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
源错误:
是怎么回事呢?
通过IE看到WSDL只能证明元数据发布成功,并不能保证服务调用一定能成功!