乍认识WCF2

参照:

http://blog.csdn.net/songyefei/article/details/7371571

以高达等同篇被,我们当一个控制台应用程序中编了一个简单的WCF服务并承接了其。先想起一下劳动端的代码:

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

using System.ServiceModel;
using System.ServiceModel.Description;

namespace HelloWCFService
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8000/MyService");

            ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress);

            host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService");

            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            host.Description.Behaviors.Add(smb);

            host.Open();

            Console.WriteLine("Service is Ready");
            Console.WriteLine("Press Any Key to Terminate...");
            Console.ReadLine();

            host.Close();

        }
    }

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

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

负有的这些代码都勾于program.cs中,干净舒适。

 

咱有些审视一下立马段先后会发现,我们为此了许多底代码来定制服务之特征,例如基地址、终结点、绑定、行为等。这些还称呼配置。而实在对劳务的自己的概念是杀少的(主逻辑就是回来一个字符串而曾),因此我们不难看出,WCF的编程中配置占了挺可怜的百分比。

 

WCF的配置选是众之,我们这里仅考虑最简单易行的图景。我们在概念及落实了劳务协定后,至少应做怎样安排才能够吃服务运作起来为?

(1) 依据服务实现类似配置一个服务(ServiceHost)。

(2) 指定一个基地址(如果得了点被指定了绝对地址,这步可概括)。

(3) 建立一个终结点,并也那指定地点、绑定和服务协定。

(4) 建立一个初数据交换终结点。

(5) 为服务丰富一个表现来启用元数据交换。

尽管当.Net
4.0下蛋微软提供了简化配置,我们竟然足以一行配置都无举行,但是为了搞明白配置的基本原理,我们临时不考虑简化配置的情。

 

以下这些配置是咱务必使做的,我们从代码中得看来以上几乎栽配备相应语句:

建立基地址:

    Uri baseAddress = new Uri("http://localhost:8000/MyService");  

成立服务:

    ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress);  

树立终结点并指定地址、绑定和劳务协定:

host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService"); 

上加元数据交换终结点并加加启用元数据交换行为:

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();  
    smb.HttpGetEnabled = true;  
    host.Description.Behaviors.Add(smb);  

看上去清楚明白,但是只是看上去特别抖,这样的布局方式在弊端,例如基地址,如果当服务配置下搬了服务器,基地址发生变化,我们亟须修改源程序并再编译重新部署才会促成之要求。对于任何的配置选也凡如此。这对产品环境是免可知接受之。好于WCF提供对此问题之缓解方案:配置文件。

 

我们把针对服务之布局写以应用程序的布置文件中(IIS程序是web.config
其他程序是app.config),当配置来变动的早晚咱们尽管不要再编译程序集了。

 

配备文件之写法很复杂,有为数不少取舍,为了便利上手,我们先行由同本例相关的抉择项开始。

 

于布局文件中,根节是<configuration>,所有的布置元素还居中间。对于WCF服务之布部分,最外层的节是<system.serviceModel>,所以安排文件中至少先应该是此法:

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

      </system.serviceModel>  
    </configuration>  

而今我们准备开部署一个劳务,服务配置元素标签呢<services></services>,是<system.serviceModel>的子节,在一个宿主上得以承接许多劳务,每一个劳务用<service></service>来部署,它是<services>的子节。在布局<service>前,我们还要先添补加一个基地址配置,基地址用<baseaddress>描述,他是<host>的子节,<host>是<service>的子节。

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service>  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost:8000/MyService"/>  
              </baseAddresses>  
            </host>  
          </service>  
        </services>      
      </system.serviceModel>  
    </configuration>  

顶这边,基地址的局部已完结,对许代码中之职务而找到了么?

劳务的布还不同一点,我们于代码中为劳动指定了实现项目,在配备文件中争指定为?就就此<service>标签的name属性,指定的早晚后如果用全限定名(带在命名空间)

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="HelloWCFService.HelloWCFService">  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost:8000/MyService"/>  
              </baseAddresses>  
            </host>  
          </service>  
        </services>      
      </system.serviceModel>  
    </configuration>  

本人这事例举的不好了,命名空间和实现项目是一个名,要注意区分。

 

及这里,服务吗配备了了,对承诺代码的岗位翻上寻找一下。

连片下去配置终结点,终结点用<endpoint>元素表示,正使代码实现中的参数,在安排中吗需要各个指定地址、绑定和劳务协定接口,分别就此address、binding和contract属性来表示,当然<endpoint>也是<service>的子节,毕竟他是属于劳动的嘛。

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="HelloWCFService.HelloWCFService">  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost:8000/MyService"/>  
              </baseAddresses>  
            </host>  
            <endpoint address="HelloWCFService" binding="wsHttpBinding" contract="HelloWCFService.IHelloWCFService" />  
          </service>  
        </services>      
      </system.serviceModel>  
    </configuration>  

此处用了针锋相对地址”HelloWCFService”,他会与基地址组合在一起(排在后边)成为终结点的地点,这里为堪指定为空字符串””,此时基地址(即服务地方)就是终结点的地方,还足以指定一个断地址,那样他见面蒙基地址,基地址对这个终结点来说即使不起作用了,这里可以视,终结点的地址是独立的,可以是基地址的子地址,也堪单独运用任何一个地方,他们之间没有一定的链接。

此地的contract
同<service>里面一样,也要是动用完全限定名称(带上命名空间)。

只顾,在动IIS承载的时光,必须使相对地址,也即是终结点必须是基地址的子地址,这是由IIS的安排组织决定的。

 

暨此地终结点也配备好,对承诺代码的岗位找到了邪?

 

连接下去是最后一步(或者说简单步),配置元数据交换终结点并开启元数据交换行为。这个过程,代码中之所以了三实践,实际上代码这三行仅仅是互补加了处女数据交换行为,并不曾配置元数据交换终结点,运行时系统啊咱自行添加了收尾点。这片沾缺一不可,虽然系统会为我们抬高,我们还是要懂得此布局的写法。这个特别重要。

 

开启元数据交换从规律及该是片宗事,第一凡服务允许元数据交换,第二是劳务提供元数据交换方式,第一修就算是补加元数据交换行为,表示服务允许这样的乞求,第二久就是劳务告诉你怎么样告,客户端是经一个定点的结点去央求的,这个终结点的地方、绑定和协定都是固定的,我们不能够转,这个是框架的预定,我们不得不依照要求配置。

 

首先,第一长长的,允许元数据交换,这个是透过为劳动丰富一个表现来促成之,行为是为此来叙述服务的特点的,不同的劳务或发雷同之行事,行为并无是归某服务独有的,因此作为于定义也<system.serviceModel>节的子节,可以于不同的劳动引用,他的概念有些像服务,外面是带s的,里面凡是匪带s的,毕竟可能发许多的行事定义嘛。

先定义个表现:

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="HelloWCFService.HelloWCFService">  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost:8000/MyService"/>  
              </baseAddresses>  
            </host>  
            <endpoint address="HelloWCFService" binding="wsHttpBinding" contract="HelloWCFService.IHelloWCFService" />  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metaExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

盖在服务作为和终结点行为的分,所有<behaviors>和<behavior>之间以套了一个<serviceBehaviors>,表示这个是劳动作为,我们啊表现制定了名字,好于<service>可以引用,也可免点名,那么有服务都见面利用。交换元数据的作为发出稳定的价签描述,就是<serviceMetadata>,对正值代码看,很熟悉吧。

 

成立了表现以后,要让我们刚建立之服务去引用他,用&美学原理lt;service>的behaviorConfiguration属性:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="HelloWCFService.HelloWCFService"behaviorConfiguration="metaExchange">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="HelloWCFService" binding="wsHttpBinding" contract="HelloWCFService.IHelloWCFService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaExchange">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

属下去第二步,建立首家数据交换终结点,建立之位置以及我们才建立的终结点位置相同,但是属性是定点的,大小写都无可知写错。

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="HelloWCFService.HelloWCFService" behaviorConfiguration="metaExchange">  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost:8000/MyService"/>  
              </baseAddresses>  
            </host>  
            <endpoint address="HelloWCFService" binding="wsHttpBinding" contract="HelloWCFService.IHelloWCFService" />  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metaExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

顶这边,配置文件就形容了了。我们管其放到程序中去,打开上亦然篇中起之服务端程序,为序上加一个布置文件

右键点击项目->添加->新建起->应用程序配置文件,名字系统会从好(app.config)。把地方的配备写上,保存。

既然我们已出了安排文件,就非需(也无应该)在代码中布局了。代码中之配置会覆盖掉配置文件被的配备。所以我们要本着代码修改一下。

ServiceHost host = new ServiceHost(typeof(HelloWCFService));  

host.Open();  

Console.WriteLine("Service is Ready");  
Console.WriteLine("Press Any Key to Terminate...");  
Console.ReadLine();  

host.Close(); 

内部,建立SeviceHost
那行被涂改了,去丢了baseAddress的参数,但是我们本需报告host
我们若存的服务类的类。

F5周转起来。

下一场在浏览器被走访一下服务试试

http://localhost:8000/MyService  

总一下今底读。

咱运用安排文件的法子就了针对性WCF服务之布,从中接触到了劳动、终结点和表现之部署方式。配置文件之要素还有许多,像绑定、安全性等等特色。在之后套到之时节再次慢慢进行,配置文件的各国一个要素都应有力求背着写下去,一行一行的描绘,在形容的过程中体味,而非是到处复制和糊,这样才会对配置文件之写法有深的印象。