起名绛河 初识WCF5

首先仍然要添加<System.瑟维斯(Service)Model>节,无论是服务端依旧客户端,只假如WCF的劳动配置都要在这一个节里面:

起名 1

 

任啥地方方并从未什么样界别,特别注目的在于指定服务实现类和协定接口类的时候势必要带上命名空间,那是一个非凡容易犯的失实。

  1. 增长必要的引用

我们需要遵从IIS宿主的渴求创制多少个文件放到IIS中才能承载起我们的服务,当然服务的有关新闻也是讲述在这么些文件中的。

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <client>  

        </client>  
      </system.serviceModel>  
    </configuration>  

 

这一步应该很熟了,假如有问号,重返前几篇温习一下。

以此布局文件和大家前边写的有局部不同之处:

 

咱俩前几日先读书在IIS中过夜,记住,IIS寄宿只援助http协议的绑定。

 

2)
<瑟维斯(Service)(Service)>标签没有了基地址的讲述,在IIS寄宿中,服务基地址是由IIS负责指定的。例如本例中服务的基地址为http://localhost/IISService/HelloWCFService.svc

既然大家早就在布局中声称了绑定和终结点地址,在代码中就不再需要了。

归来VS2010,仍旧文件->新建->文件,选用文本文件。

因为从没运用服务引用,客户端现在尚无此外元数据的音信,大家要来手写。首先把劳务协定写进去。这几个再精通不过了(写在Program类前边):

起名 2

或者有一对预备要做,还差五个元数据吧,对了,就是绑定和地址。和上一篇一样,我们先成立这一个四个元数据的靶子备用:

为应用程序指定一个别名,这么些可以肆意起的,这多少个名字将变为未来劳动地点的一局部,我把它起作IIS瑟维斯(Service),物理路径就选拔大家刚刚建立的文书夹。

 

封存一下,大家继续前行

别忘了你的地步,凡人!大家这是在客户端啊,怎么可能有劳动协定吗?这多少个可以有,可是这些实现不是我们在做,而是要和服务端通信让服务端做,这里可以看看代理显著的性状了,代理类即便实现了劳动协定的办法,可是在艺术中,他调用了基类(就是ClientBase<>)上的大道,并经过通道调用了了协定方法。此时,ClientBase<>已经为我们建立好与服务端的大道了,而且是用劳动协定建立的,我们自然可以在通道上调用服务协定的章程。所以调用代理类对象的HelloWCF()的长河是代理类委托基类在曾经创建好的劳务协定通道上调用协定方法,并从服务端拿到重临值,然后再回去给代理类对象的调用者。狗腿啊狗腿。

除了自托管,WCF仍是可以够借宿于IIS、Windows服务、Windows进程激活服务(WAS)中。相比较盛行的是在IIS和Windows进程激活服务寄宿。

万一你忘记了俺们在第三篇中布局的IIS服务的情节,可能稍有迷惑,那里的地点看上去是个劳务地点而不是终结点地址,这是因为大家在IIS中把终结点地址设置为了空字符串,此时劳动地点就是终结点地址了。注意看前面的contract,他的一点一滴限定名的命名空间是客户端程序的命名空间ConsoleClient,这也代表这些序列是概念在本地的,不要搞错了。

  1. 建立IIS应用程序
  1. 再开展一点点

这应当是个svc文件,而不是.txt文件,所以我们另存一下,另存的时候要注意保存类型选为所有文件。我把那些文件起名为HelloWCFService.svc,这么些名字可以无限制起,这一个名字也将改为服务地点的一部分。保存地点就是大家刚刚确立IIS应用程序的地点。

别忘了关闭通道,ClientBase<>很恩爱的为我们准备了那个情势,不用再做强制类型转换什么的了(见前一篇)。

自我把这些文件夹建立在了C:\WCF\下,取名为IIS瑟维斯(Service)。(HelloWCF是大家在前两篇中树立的,还记得么)

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

故而大家这些事例的劳动地方应该是:http://localhost/IISService/HelloWCFService.svc 

咱们密切看服务引用的reference.cs代码,有同等东西是我们有而他从未的,这就是对终结点地址和绑定的创制,而且在应用劳务引用的时候我们也尚无提供之两样东西,直接掉服务协定方法就行了(见第一篇),那么服务引用是从什么地方找到这三个基本点的元数据元素呢?

有关运营服务,IIS都会为大家去做,只要IIS应用程序(或网站)在线,服务就在线运行。

接下去就可以调用服务协定方法了:

前几天我们来编排那个文件的内容,很简短,就只有一行代码。

    WSHttpBinding binding = new WSHttpBinding();  
    EndpointAddress remoteAddress = new EndpointAddress("http://localhost/IISService/HelloWCFService.svc");  

可以看到我们正好制造的HelloWCF瑟维斯(Service).svc已经被识别为WCF服务了。

 

我们来手动建立这一个文件,打开VS2010,选用文件菜单->新建->文件。在正规栏目中,采纳一个文件文件,然后点击”打开”按钮

 

IIS7

public class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
{  
    public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
        : base(binding, remoteAddress)  
    {   

    }  
} 
    using System;  
    using System.ServiceModel;  

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

        public class HelloWCFService : IHelloWCF  
        {  
            public string HelloWCF()  
            {  
                return "Hello WCF!";  
            }  
        }  
    }  

封存,配置已经写完了,你一旦看服务引用为我们转移的配置会合到一堆东西,实际上主旨的就是这多少个。

起名 3

public class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
{  
    public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
        : base(binding, remoteAddress)  
    {   

    }  

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

IIS寄宿的劳动地方格式:

到这边曾经和服务引用的感觉基本等同了,我们早就写出了劳务引用的基本部分。

 

 

  1. 树立劳动文件
  1. using System.ServiceModel; 
  1. 总结。

时至前些天,我们对通信有了一个主旨的垂询,只好算一个初探吧。然则我信任这五回的微乎其微深切会对我们之后的上学带来大大的帮忙的。

我们早已很领悟,还亟需一个布置文件,在其中安排终结点、服务、行为等等的消息。这些布局文件和我们在此之前建立的大致相同。

 

 

 

<%@ServiceHost language=c# Debug="true" Service="LearnWCF.HelloWCFService"%>  

 

点击确定,IIS应用程序就建好了,大家得以见见在默认网站下多了这么些应用程序,然则中间还怎么都没有。

第五篇
再探通信–ClientBase

到此处,在IIS中的寄宿就做到了,很简短,一个IIS应用程序,3个文本。当然这只是最简便的意况。

    public class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
    {   

    }  

拓展右边的节点,在默认网站节点上点击右键,采纳“添加应用程序”

 

在IIS中过夜,需要IIS5.1或更高版本的帮忙,IIS会为大家管理ServiceHost(还记得他吧,看率先篇中的代码),同时为我们提供经过回收、空闲关闭、进程运行情况监视等特性辅助,大家只需要把劳动相关的文书依照一定的团队措施放入IIS的托管中(就像建立一个网站应用程序或虚拟目录),IIS会为我们管理整个。这种托管受到支撑的体系广大,从Windows
XP SP2 到 WIndows Server
2008,所以它丰硕流行。可是他也有毛病,它不得不接受http协议的绑定,对于tcp、管道、MSMQ都是不帮助的。

就在配置文件里,大家做的客户端还尚无配备文件,我们得以把那多少个元素都置身配置文件里,这样就可以防止硬编码了。

保留,大功告成

如此看起来已经挺成功了,大家现在再打开服务引用的reference.cs代码,看看是不是绝大多数都看得懂了?监管有些地方他写的也许有点复杂,比如描述协定的习性参数啊,代理类更多的构造函数啊,可是主题的就是我们恰好写的一些,那一大堆wsdl什么的骨子里都不是基本,不信的话你把她们都删掉,就留一个reference.cs看看还好欠好用?那一堆东西也不是没用就是前几天友美观起来还蛮复杂的,我们到末端一点点就学。

(3)
在应用程序路径的子目录App_Code下建立XXX.cs文件用于定义和落实劳务协定

为大家的控制台应用程序添加一个应用程序配置文件。方法是右键点击项目->添加->新建项->应用程序配置文件。保持默认名称app.config。

抑或回到VS2010,仍旧新建一个文书文件,另存为web.config。这些文件名,是不可以改的,保存路径是我们建立的IIS应用程序IIS瑟维斯(Service)(Service)的目录下(和svc保存在共同)

 

 起名 4

F5周转一下,结果如一吧!

起名 5

  1. 创立客户端程序

本次大家要创造的是类公事,其名字为HelloWCF瑟维斯(Service)(Service).cs,注意另存为的时候要把保存类型选为所有文件,路径要采用大家刚建立的App_Code文件夹

    HelloWCFClient client = new HelloWCFClient(binding, remoteAddress);  

IIS应用程序需要映射到地点驱动器的一个大体路径上,我们先把它建好。

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

using System.ServiceModel;  

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

            HelloWCFClient client = new HelloWCFClient(binding, remoteAddress);  

            string result = client.HelloWCF();  

            client.Close();  

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

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

    public class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
    {  
        public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
            : base(binding, remoteAddress)  
        {   

        }  

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

http://机器名/IIS应用程序名/XXX.svc  

接纳ChannelFactory<>和ClientBase<>都足以实现与服务端的通信,这是类库辅助的万丈层次的通讯情势了,其实还有更底层的通道通信情势,我们明天就不再长远了。而挑选这三种方法完全取决于开发人员,有人欢喜工厂,有人喜欢代理类。既然我们都早已精通了,就即兴挑选吗。

起名 6

 

(4) 在应用程序路径下成立web.config 用于配置服务。

 

这一篇大家上学了什么在IIS中寄宿WCF服务,必备的元素总计如下几点:

我们一方面出手一边念书

  1. 完成

 

 

打开来看,里面没写什么实际的内容:

不过,假使作为最后产品部署,自托管的过夜格局就不那么适合,应用程序相比框架(IIS、Windows服务等)是不安定的,WCF与应用程序共享生命周期,应用程序关闭后WCF也会终止。还有好多特点诸如进程回收、空闲关闭等自托管都是不协助的。因而,为了使我们的WCF符合产品级其余要求,应该为其选取一个更稳定、伸缩性更好的宿主。

 

  1. 为IIS应用建立物理地方
  1. 总结

编制那一个文件,大家在此处定义和促成服务协定,应该很精通吧,尝试着背着写下来吗。

 

把写的内容保留一下,我们继续上扬。

 

Visual Studio 2010 旗舰版 SP1

 

诚实的读书,我们前几天不借助于IDE帮衬建立的档次,完全手写一个下榻于IIS的劳动。

public HelloWCFClient()  
    : base()  
{   

} 

接下去我们要写那些概念服务的类公事了。不过在这在此以前,大家先为类公事建立一个存放的职务,IIS的代码文件应该存放在IIS应用程序目录的App_Code子目录下,所以大家先把这一个文件夹建立起来。

string result = client.HelloWCF(); 

老艺术,在浏览器里面看一下,是不是水到渠成了。

把我们恰好建立的六个元数据对象作为参数传递进去。

经过前两篇的求学,大家询问了什么搭建一个最简单易行的WCF通信模型,包括定义和实现服务协定、配置服务、寄宿服务、通过充裕服务引用的点子部署客户端并访问服务。我们对WCF的编程生命周期有了一个最基本的询问。

ClientBase<>有好多的构造函数,接受不同类其余参数来创设代理类对象,其实这多少个参数都是元数据音信,刚才大家已经因而泛型参数传递给基类服务协定这么些元数据了,现在基类还索要绑定和终结点地址那三个元数据才能正确创设连接,所以我们后续的新类应该把这一个构造函数给覆载一下接受这二种元数据参数并传递给基类。

在前两篇的例证中,我们树立了一个控制台应用程序来作为劳动的宿主,那种寄宿格局叫做”自托管”,即WCF服务和应用程序是环环相扣的。这种寄宿格局有一对亮点,他索要最少的框架援助(只需要一个控制台应用程序就可以了,随处建立,随处运行),由此配置和行使都是最简便易行的,此外通过控制台程序还足以对WCF服务运作中生出的不当举办监视,在付出服务等级,这种情势能提供调试的惠及。

 

(2) 在应用程序路径下树立XXX.svc文件用于讲明WCF入口和劳动地点导航

咱俩对部署服务应该不陌生,假若忘记了,翻回到第二篇去回顾一下。

svc就是service的意思了,大家需要首先建立一个XXX.svc的文本放到IIS应用程序目录下,那么些文件是服务的入口,客户端需要这一个文件的地方来访问服务(当然也包罗原数据互换)。

抑或怎么也不做,直接调基类的无参构造函数。

因为用IIS,所以系统活动提交了交流元数据的机器地址,而并未用localhost。

既然我们兑现了劳动协定接口,当然要落实接口的不二法门了。上面大家把艺术的落实写下来:

(1) 建立IIS应用程序及物理路径

然后我们在<Client>中添加一个终结点,这个是客户端的终结点,我们前面曾经提过,通信实际上发生在两个终结点间,客户端也有个终结点,然而请求总是从客户端首先发起,所以终结点地址应该填写为服务端终结点的地址让客户端来寻址,但是服务协定要客户端本地是有的,所以这个要写本地定义的那个协定的完全限定名:

那么些代码应该很谙习的打出去,假如对这段代码还有如何不知底的地点,急迅翻回第一篇复习一下。

下一场修改一下Main函数,去掉终结点对象和地方对象的申明,并用无参构造函数来new
代理类的实例:

Windows 7 家庭高级版 SP1

首先我们修改一下代理类,为他提供一个尚未参数的构造函数,否则在new他的时候她会非管大家要六个参数。

http://www.cnblogs.com/xiangchangdong/p/3924030.html

俺们用到的ClientBase<>类在System.Service(Service)Model程序集中,因而,要抬高这一个顺序集的引用,同时在program.cs中添加using语句

前几天让我们有点尖锐一些,掌握一些有关住宿的新知识:在IIS中过夜服务。

以下是修改后的Program.cs完整代码:

在前两篇中示范的例证,一定要力求背着做下来,包括源程序、配置文件都要背着一行行的手写下来,这样才能有深入的咀嚼。WCF的学识零散复杂,必须踏实的学习和操练。假如您还未曾形成领悟于胸,现在赶紧翻回到把例子再做五回。

 

被<%%>框住的象征这个是一个劳务器端包含,@ServiceHost
标签表示这是个WCF的劳动,联想一下前两篇代码中的瑟维斯(Service)Host
对象。language=c#
表示大家用C#言语来写代码,Debug=true顾名思义了,最着重的是Service(Service)这么些特性,他意味着这多少个服务的兑现类是咋样,这里要用完全限定名,即要包括取名空间。我起了一个命名空间名LearnWCF,我们把劳务概念都位于这一个命名空间下,后边的HelloWCF瑟维斯(Service)(Service)就是劳动的兑现类了。我们接下去要去完善那一个类的始末。

引用http://blog.csdn.net/songyefei/article/details/7389186

起名 7

接下去就要建立大家的代理类对象了,new一个出来吧:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

以下是Program.cs的整套代码:

1) 配置文件的文书名为web.config,而不是app.config

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
    </configuration>  

 

下面已经涉嫌,大家要团结写一个新类来继承ClientBase<>基类,这样那一个新类就是代理类了,同时,为了能够用代理类间接调用服务协定的方法,大家还要让代理类实现服务协定的接口,注意,继承要写在前边,实现接口要写在末端。我们把这么些类起名为HelloWCFClient。

 

 

 

代理类已经写完了,我们前日上马写程序的主心骨,让我们过来Program的Main函数中。

 

我们看看这些新建的构造函数什么也没做,只是接受了六个参数,一个是绑定,一个是终结点地址,然后直接调用基类(也就是ClientBase<>)的构造函数,把那个六个参数传递了上来。其实工作都是ClientBase<>做的,大家新建的类就是个传话的,要不然怎么叫代理呢,他如何活都不干。

起名 8

ClientBase<>类也是一个泛型类,接受劳务协定作为泛型参数,与ChannelFactory<>不同的是,这么些类是一个基类,即抽象类,是无法实例化成对象直接利用的,大家需要自己写一个类来继续这么些类,我们新写的类实例化出来就是客户端代理了,这一个目的可以调用基类的有些受保障的主意来促成通信。ClientBase<>为我们封装的很好,大家只需要写个新类来连续他就可以了,通信的成百上千有的他都替我们做好了,比如我们不用举办去创建通道和开拓通道的操作,直接调用协定方法就能够了。这也是服务引用和其它元数据变化工具(如svcutil)使用这么些类来布局客户端代理的原委。

 

在此地大家要配备的是客户端,所以我们不添加<Services>节了,而改成<Client>:

3)
终结点的地址指定为了空,表示就利用服务基地址作为终结点地址,当然这里也可以指定一个相对地址,但是不可以指定相对地址,必须听从IIS指定的基地址。

client.Close(); 

 

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.serviceModel>  

  </system.serviceModel>  
</configuration> 

试行环境在证实一下:

    static void Main(string[] args)  
    {  
        HelloWCFClient client = new HelloWCFClient();  

        string result = client.HelloWCF();  

        client.Close();  

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

起名 9

  1. 编辑客户端代理类

(2) cs文件

 

(3)web.config文件

 

(1) svc文件。

 

起名 10

在上一篇中,大家抛开了劳动引用和元数据交流,在客户端中手动添加了元数据代码,并运用通道工厂ChannelFactory<>类创制了大路,实现了和服务端的通信。不过,与服务端通信的编程模型不只一种,前几日我们来学习运用其它一个劳务类ClientBase<>来完成同样的办事,了解了这些类的利用办法,大家对服务引用中的关键部分就可知领悟了。

(5) 保持IIS为启动状态。

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

    using System.ServiceModel;  

    namespace ConsoleClient  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                HelloWCFClient client = new HelloWCFClient();  

                string result = client.HelloWCF();  

                client.Close();  

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

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

        public class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
        {  
            public HelloWCFClient()  
                : base()  
            {   

            }  

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

            }  

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

可以见到。.svc文件就相当于一个携带,帮大家在IIS宿主中找到服务的地点,具体的代码,大家可以写在另一个地点(其实也得以写在svc文件中,不引进)。

俺们如故不用服务引用,完全手写,本次如故建立一个控制台应用程序作为客户端。

从IIS7起先,提供了所谓Windows进程激活服务(WAS)
的效率,假若把WCF寄存在WAS中,就可以扶助所有的绑定协议(TCP等),像MSMQ这样的协议,在内网和.Net编程模型下有很大的性质优势,由此WAS应该会化为将来WCF寄宿的机要措施,可是IIS7要求Windows
Vista以上版本的体系才能支撑,他的普及可能尚需时日吧。

通过本篇的学习,大家耳熟能详了另一种与服务端通信的不二法门,即由此ClientBase<>派生代理类的方法,这种模式其实就是劳动引用使用的办法,能够说大家已经在最简便级别上手写了一个服务引用的落实。

 

  1. 编写程序主体

其三篇 在IIS中过夜服务

 物理路径建好了,现在我们在这么些岗位上树立一个应用程序。点击先河->控制面板,在类型中找到管理工具,然后打开IIS。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图