绛河 初识WCF4

 

((IClientChannel)channel).Close(); 

参考:

 

(1) 建构顾客端。

以此进度大家很熟练,创建三个调控台应用程序,不做其余其余事,独有清清爽爽的program.cs

 

 

 

利用参数为空的构造函数就能够。

个中有二个cs文件,这几个大概大家应当看得懂,张开来探视

 

经过前几篇的就学,大家简要询问了WCF的服务端-客商端模型,能够创建二个粗略的WCF通讯程序,并且能够把大家的劳动寄宿在IIS中了。大家不禁感叹WCF模型的归纳,寥寥数行代码和布署,就能够把通信创设起来。但是,留意品尝一下,这里面依然有超级多疑难:服务器是何许建起劳务的?大家在顾客端调用二个操作后发出了什么?元数据到底是怎么着事物?等等。我们前几天对WCF的知情应该还地处初级阶段,大家就能够认为有为数不菲那样的谜团了。

 

只选用八个String参数,正是U讴歌RDXI地址,这里小编用了第三篇中创设的IIS服务的地址。

图片 1

WSHttpBinding binding =  WSHttpBinding();

顾客端要求怎样东西手艺幸不辱命那意气风发雨后玉兰片的操作呢?元数据和局地劳务的类。服务类由System.瑟维斯Model类库提供了,只差元数据。提到元数据大家不禁倒吸一口凉气,难道是那一批XSD OOXX的东西么?作者感到,是亦不是。就我们以那件事例来讲,元数据包涵:服务协定、服务端终结点地址和绑定。对,就这么多。我们是不是迟早要通过元数据沟通下载去服务端获取元数据吧,当然不是,就以此事例来说,服务端是大家兼备的,这三地方的元数据大家本来是胸有成竹的。

服务协定是元数据中最重视的片段(还应该有数据协定等),协定接口是服务器和客商端一同全体的,顾客端依据协定来创建通道,然后在通路上调用协定的秘技,方法的贯彻,顾客端是不明白的。客商端只略知意气风发二方法签字和重回值(即接口)。

 

图片 2

 不过,怎么样落到实处吗?大家开采通道无法提供关闭的诀要,那是因为我们用IHelloWCF接口注解的大路对象,那那一个目的自然只可以提供接口所规定的艺术了。而实在通道对象自己是提供关闭措施,只是被我们来得的接口表明给挡住了,通道其实已经落到实处了另多个接口叫做IClientChannel,那些接口提供了开辟和关闭通道的法子。假诺大家要调用,只必要把通道对象强制转换来IClientChannel接口类型就足以了:

 

那样第一次全国代表大会堆,有一点xsd文件大家兴许清楚是框架描述的文书档案,那wsdl什么的是何等,还会有disco(迪斯科?)是何等,稀里糊涂。

 

固然大家料想VS2009也不会荡然无存,大家是足以直接享受它提须要大家的有益的。不过大家后日在那处斟酌,无妨把调节等级向向下探底二个档次。看看上面有怎么着。

(2) 编写服务协定

大家通过手绘代码的方法完毕了顾客端和服务端的通讯,未有依赖元数据交流工具。这让大家对服务端和客商端通讯有了更相似真相的黄金时代层认识。其实所谓的元数据交流正是让我们收获如此以致更简便易行的编制程序模型,它背后做的作业跟我们后天做的是很左近的,想像一下,产品级的劳务恐怕有众多的缔约接口,非常多的终结点,大家比较小概也不应当成本劲气把他们在顾客端中再手动提供一遍,由此元数据沟通是很有含义的,大家应有学会使用它,我们还要在末端的学习中不唯有左右精晓元数据沟通工具的办法。

进程大致是如此的,有个别地方或然不太严刻,但是这些逻辑大家是足以驾驭的。如此看来,通信的专门的学问非常重要部分都在客户端那边,他要确立通道、发送音讯,服务端基本上在伺机央求。

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.42000
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------

namespace HelloWcfClent.MyService {


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyService.IHelloWcfService")]
    public interface IHelloWcfService {

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHelloWcfService/HelloWcf", ReplyAction="http://tempuri.org/IHelloWcfService/HelloWcfResponse")]
        string HelloWcf();

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHelloWcfService/HelloWcf", ReplyAction="http://tempuri.org/IHelloWcfService/HelloWcfResponse")]
        System.Threading.Tasks.Task<string> HelloWcfAsync();
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface IHelloWcfServiceChannel : HelloWcfClent.MyService.IHelloWcfService, System.ServiceModel.IClientChannel {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class HelloWcfServiceClient : System.ServiceModel.ClientBase<HelloWcfClent.MyService.IHelloWcfService>, HelloWcfClent.MyService.IHelloWcfService {

        public HelloWcfServiceClient() {
        }

        public HelloWcfServiceClient(string endpointConfigurationName) : 
                base(endpointConfigurationName) {
        }

        public HelloWcfServiceClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }

        public HelloWcfServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress) {
        }

        public HelloWcfServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress) {
        }

        public string HelloWcf() {
            return base.Channel.HelloWcf();
        }

        public System.Threading.Tasks.Task<string> HelloWcfAsync() {
            return base.Channel.HelloWcfAsync();
        }
    }
}

这几个通道工厂类的构造函数选取一些重载参数,使用那些参数向通道工厂提供服务端终结点的新闻,包涵地方和绑定,那正是元数据的任何两有的。大家先把这两样做好希图着。

但是,怎么着完成啊?大家开采通道无法提供关闭的方法,这是因为我们用IHelloWCF接口注解的坦途对象,那这一个指标自然只可以提供接口所鲜明的办法了。而事实上通道对象自作者是提供关闭措施,只是被我们展现的接口表明给挡住了,通道其实早已达成了另二个接口叫做IClientChannel,那些接口提供了张开和关闭通道的措施。即使大家要调用,只需求把通道对象强制转变来IClientChannel接口类型就足以了:

闲话少说,大家以后已经清楚了黄金年代件最中央的业务,顾客端和服务器是要开展通讯的。那么那一个通讯是什么样爆发的呢?依据我们前边的就学,从实操上看,我们在服务端定义好协定和促成,配置好公开的终结点,展开元数据调换,在顾客端增多服务援引,然后就直接new出来叁个叫做XXXClient 的对象,这些目标拥有服务协定里的装有办法,直接调用就足以了。留意考虑?天哪,那总体是怎么发生的?!

  1. 再开展一小点

 

IHelloWCFChannel channel = factory.CreateChannel();  

(2) 加多需要的引用

前边说过,客商端完结通讯的号令需求部分服务类的帮衬,那一个类都定义在System.ServiceModel中,由此我们要抬高那些顺序集的援引。(注意是增添引用,不是服务援用)。

笔者们地点手绘的前后相继能够展开通道并调用服务,但是大家想起大家事先经过劳动援引构建的客商端都以提供八个Close()方法来关闭服务连接的。使用大家这种方法按说也应当关闭通道才对,就算客商端关闭通道就能被关闭了,然则在运用完通道后关门之连接好的习贯。

服务端定义协定和促成并当着终结点,那看起来没什么难题,固然大家对底层的兑现不了然,但总归是合乎逻辑的,而顾客端怎么就透过二个加上服务引用就解决一切了啊?就好像秘密在此个增多的服务援引中。

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.ServiceModel;  

    namespace ConsoleClient  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                EndpointAddress address = new EndpointAddress("http://localhost/IISService/HelloWCFService.svc");  
                WSHttpBinding binding = new WSHttpBinding();  

                ChannelFactory<IHelloWCFChannel> factory = new ChannelFactory<IHelloWCFChannel>(binding, address);  

                IHelloWCFChannel channel = factory.CreateChannel();  

                string result = channel.HelloWCF();  

                channel.Close();  

                Console.WriteLine(result);  
                Console.ReadLine();  
            }  
        }  

        [ServiceContract]  
        public interface IHelloWCF  
        {  
            [OperationContract]  
            string HelloWCF();  
        }  

        public interface IHelloWCFChannel : IHelloWCF, IClientChannel  
        {   

        }  

    }  
IHelloWCF channel = factory.CreateChannel();  
ChannelFactory<IHelloWCFChannel> factory = new ChannelFactory<IHelloWCFChannel>(binding, address);

聊起底,大家在调用服务操作之后,就足以向来调用关闭通道的议程了:

诸如此比一群代码,都不是我们写的,开首看有如有多少个类/接口,IHelloWCF,那个应该是劳动协定,估算或者是从服务端下载来的,HelloWCFClient,这么些正是大家的客商端代理嘛,大家在头里用过,原本是在这里边定义的,但是前边继承的ClientBase<>是干嘛用的,还重载了那般多的构造函数。还应该有叁个IHelloWCFChannel接口,大家找遍实施方案也找不到什么地点用到她了哟,干嘛在此定义出来吧?

好的,元数据的其他分化也思谋齐全,以往请通道工厂闪亮登场,大家new二个它的实例,用刚刚确立的劳务协定接口作为泛型参数,使用方面创设之处和绑定对象作为构造函数的参数:

string result = channel.HelloWCF();  
 Console.WriteLine(result);  
Console.ReadLine();  Console.WriteLine(result);  
Console.ReadLine(); 

先不去细想那一个代码的求实意思,见到此间,大家在对VS二零零六真挚称誉的同一时候,不由得心中升起一丝顾虑,若无了VS2008,未有了IDE,未有了"加多服务援用",我们该怎么办?

于今,通道早就展开,大家得以调用那一个通道上的缔约方法了。

接下来在Program.cs中using那一个命名空间

 2. 我们和谐写通讯

 

修改后的program.cs源代码:

(3) 通道工厂进场

张开第二篇中大家塑造的客商端(借使您为第三篇的IIS服务建设构造了客商端,展开这么些也行,我用的正是以此),看看服务引用里面有啥样。

 

EndpointAddress address = new EndpointAddress("http://localhost/IISService/HelloWCFService.svc"); 

图片 3

  1. 总结

今日的钻研微微尖锐了一小点,未有完全领会也从来不提到,心里有个概念就足以了。

第豆蔻年华,做那几个新接口,这几个接口只是把劳务协定接口和IClientChannel拼接,自丁巳有其余成员,是二个空切口。

 

Yahoo!,大家没有接受元数交流的作用,凭伊始绘的元数据和代码就水到渠成了客户端到劳动器端的通讯。未有服务援用、未有配置文件,大家还是做获得。即便对总体经过还不能够一心知晓,可是对通讯进度已经有一点驾驭了。

 

到此地早就很成功了,大家再稍加张开一些,还记得我们稍早先在服务援用生成的文件reference.cs见到的三个接口IHelloWCFChannel么?大家找遍解决方案也没觉察哪个地点使用它?他是否没用的东西啊,当然不会,大家现在来讨论一下它。

第四篇 初探通讯--ChannelFactory

纵然大家生存在WCF为大家构建的美好的应用层空间中,可是对于任何意气风发项本事,我们都应力求不负众望知其所以然,对于底层知识的刺探有利于大家越来越好的接头上层应用,因而在刚最早读书入门的时候,慢一点、细一点,笔者以为是很有低价的。

System.ServiceModel提供了一个名称为ChannelFactory<>的类,他经受服务协定接口作为泛型参数,那样new出来的实例叫做服务协定XXX的坦途工厂。看名就可知意思了,那么些工厂专门生产通道,那些通道正是架设在服务器终结点和客商端终结点之间的通讯通道了。由于那些通道是用劳动协定来创设的,所以就可以在这里个通道上调用这么些服务协定的操作了。

在应用方案浏览器中式茶食击上方的"显示全体文件"按键,然后开展服务援用。

绑定,大家的服务端终结点供给的是wsHttpBinding,大家也能够用劳动类来表示,叫做WSHttpBinding,大家new三个它的实例:

 

但是这么做相当不够自然高贵,强制转变总是让人莫名苦闷的东西。能或不可能保全IHelloWCF的对象类型并让她能够提供关闭措施呢?当然是足以的。大家再创设二个接口,让那个接口同一时间完成IHelloWCF服务协定接口和IClientChannel接口,并用那些新接口去new 通道工厂,这样分娩出来的坦途对象不就足以相同的时间采用IHelloWCF中的服务操作和IClientChannel中的关闭通道的点子了么?

通讯到底是怎么发生的?简单说便是八个终结点贰个通道,实际上客商端也有贰个终结点的,客商端会在此七个终结点之间确立一个坦途,然后把对服务端服务的调用封装成音信沿通道送出,服务器端得到音讯后在服务器端创建劳动指标,然后施行操作,将重回值再封装成音讯发给客商端。

ChannelFactory<IHelloWCF> factory =  ChannelFactory<IHelloWCF>(binding, address);  

有了工厂,接下去将在开首坐褥通道,通超过实际践通道工厂的CreateChannel方法光临盆三个坦途,由于工厂是用大家的签定接口创造的,所分娩的坦途也是促成那个接口的,大家能够直接用协定接口来声称其重临值。

    [ServiceContract]  
    public interface IHelloWCF  
    {  
        [OperationContract]  
        string HelloWCF();  
    }  

地方,也得以称终结点地址,实际上正是个U奥迪TTI了,大家也会有多少个专项使用的劳务类来代表他,叫做EndpointAddress,大家new三个它的实例:

 

劳动协定大家都很熟稔了,背着打出来吗。就写在Program类的背后

接下来大家把结果输出,好似早先做的客商端程序相符。

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.ServiceModel;  

    namespace ConsoleClient  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                EndpointAddress address = new EndpointAddress("http://localhost/IISService/HelloWCFService.svc");  
                WSHttpBinding binding = new WSHttpBinding();  

                ChannelFactory<IHelloWCF> factory = new ChannelFactory<IHelloWCF>(binding, address);  

                IHelloWCF channel = factory.CreateChannel();  

                string result = channel.HelloWCF();  

                Console.WriteLine(result);  
                Console.ReadLine();  
            }  
        }  

        [ServiceContract]  
        public interface IHelloWCF  
        {  
            [OperationContract]  
            string HelloWCF();  
        }  
    }  

 Program.cs的全数代码

using System.ServiceModel;

  1. 劳动援引初探

下一场,修正一下前面的创立通道工厂的讲话,用这么些新接口名作为泛型参数来new通道工厂

所以,让服务援引见鬼去呢,大家友好来。

OK,元数据的首先某些成功了,其余两有的大家在代码里面提供。

channel.Close();  

校订一下生育通道方法的目的表明类型,用新接口类型评释:

 public interface IHelloWCFChannel : IHelloWCF, IClientChannel  
{   

}

明天,大家领会了服务援引中国和南美洲常看上去没用的接口是什么样意义了啊。然则服务引用中的完毕跟大家这种依旧有分其余,它接收了三个叫作ClientBase<>的类来进行通道通讯,大家前面会开展。

咱俩把在服务端定义的服务协定维持原状的照搬过来,注意,只把接口搬过来,不要把实现也搬过来,这是服务端技术有所的。

 

 

 

本文由2020欧洲杯官方投注-2020欧洲杯官方投注网址发布于win7,转载请注明出处:绛河 初识WCF4

相关阅读