初识WCF2

那边的contract
同<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>  

在安排文件中,根节是<configuration>,全体的配置成分都放在中间。对于WCF服务的配备部分,最外层的节是<system.serviceModel>,所以布署文件中足足先应该是那个样子:

此地用了针锋绝对地址”HelloWCFService”,他会和集散地址组合在一齐(排在后面)成为终结点的地点,那里也能够钦命为空字符串””,此时营地址(即服务地点)正是终结点的地址,还是能够钦命一个纯属地址,那样他会覆盖集散地址,集散地址对这些终结点来说就不起成效了,那里能够观望,终结点的地址是单身的,能够是营地址的子地址,也足以独立行使另二个地点,他们之间没有必然的链接。

    <?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>  

既然如此大家早已有了配置文件,就不必要(也不应当)在代码中配备了。代码中的配置会覆盖掉配置文件中的配置。所以我们要对代码修改一下。

抱有的那一个代码都写在program.cs中,干净清爽。

陈设文件的写法很复杂,有广大取舍,为了方便上手,我们先从跟本例相关的选项起初。

明天大家准备初叶布署二个劳动,服务配置成分标签为<services></services>,是<system.serviceModel>的子节,在1个宿主上得以承接许多劳务,每1个劳动用<service></service>来布局,它是<services>的子节。在布局<service>前,大家还要先添加3个营地址配置,营地址用<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>  

 

看起来清楚精通,不过只是看起来很漂亮,这样的布署格局存在弊端,例如营地址,倘诺当服务配置之后迁移了服务器,营地址产生变化,我们亟须修改源程序等量齐观复编写翻译重新布置才能完结这么些必要。对于此外的安排选项亦是这么。那对于产品环境是不能够承受的。还好WCF提供针对性这些标题标缓解方案:配置文件。

接下去配置终结点,终结点用<endpoint>成分表示,正如代码实现中的参数,在布局中也亟需各类钦点地址、绑定和劳务协定接口,分别用address、binding和contract属性来表示,当然<endpoint>也是<service>的子节,终归她是属于劳动的呗。

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

到此处,服务也配备完了,对应代码的职位翻上去找一下。

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!";
        }
    }
}

树立劳动:

注意,在应用IIS承载的时候,必须采纳绝对地址,也即是终结点必须是集散地址的子地址,那是由IIS的安顿协会决定的。

创立终结点并钦定地点、绑定和劳动协定:

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

      </system.serviceModel>  
    </configuration>  

 

    <?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>  

在上一篇中,大家在四个控制台应用程序中编辑了2个总结的WCF服务并承接了它。先想起一下服务端的代码:

 

开启元数据沟通从常理上相应是两件事,第壹是劳动允许元数据交流,第一是劳动提供元数据交流方式,第①条就是添法郎数据调换行为,表示服务允许那样的央求,第叁条正是劳务告诉您怎么请求,客户端是经过多少个定点的终结点去央求的,那一个终结点的地址、绑定和协定都以定位的,大家不能够更改,那么些是框架的约定,大家只能按供给布置。

 

因为存在服务行为和终结点行为之分,全体<behaviors>和<behavior>之间又套了四个<serviceBehaviors>,表示这几个是服务行为,大家为行为制定了名字,好让<service>能够引用,也能够不点名,那么全体服务都会动用。沟通元数据的作为有定位的竹签描述,就是<serviceMetadata>,对着代码看,很纯熟吧。

F5运作起来。

    <?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>  

到那里终结点也布置实现,对应代码的地方找到了呢?

即便在.Net
4.0下微软提供了简化配置,大家居然足以一行配置都不做,可是为了搞驾驭配置的基本原理,大家一时半刻不考虑简化配置的情事。

接下去是最终一步(或然说两步),配置元数据交流终结点并开启元数据交流行为。这些过程,代码中用了三行,实际上代码那三行仅仅是添加了元数据调换行为,并没有布署元数据交流终结点,运营时系统为大家自行添加了终结点。这两点缺一不可,即使系统会为咱们抬高,大家照旧要驾驭那一个布局的写法。这几个很首要。

小编们选拔布置文件的章程成功了对WCF服务的布署,从中接触到了劳动、终结点和作为的布局格局。配置文件的要素还有众多,像绑定、安全性等等特色。在后头学到的时候再稳步进行,配置文件的每1个要素都应当力求背着写下去,一行一行的写,在写的历程中体味,而不是随处复制和粘贴,那样才能对安插文件的写法有深切的回忆。

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

 

参照:

树立营地址:

总括一下明天的学习。

咱们略微审视一下那段程序会意识,大家用了诸多的代码来定战胜务的特征,例如营地址、终结点、绑定、行为等。那几个都称呼配置。而真的对劳务的自己的概念是很少的(主逻辑便是回来贰个字符串而已),因而大家不难看出,WCF的编制程序中布局占了很大的百分比。

咱俩把对劳动的配置写在应用程序的配备文件中(IIS程序是web.config
别的程序是app.config),当配置爆发变更的时候咱们就绝不再行编写翻译程序集了。

<?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>

 

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

 

中间,建立SeviceHost
那行被改动了,去掉了baseAddress的参数,可是我们仍急需报告host
大家要存放的服务类的类型。

劳动的配备还差不多,大家在代码中为劳动钦点了落到实处项目,在安顿文件中哪些内定呢?就用<service>标签的name属性,内定的时候后要用完全限定名(带着命名空间)

WCF的铺排选项是多多益善的,大家那里只考虑最简易的景况。咱们在概念和贯彻了服务协定后,至少应该做哪些布署才能让服务运作起来吧?

 

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

自家这么些事例举的倒霉了,命名空间和落实项目是一个名字,要留心区分。

 

先定义个表现:

先是,第1条,允许元数据交换,那么些是通过为劳动丰硕2个行为来落到实处的,行为是用来描述服务的表征的,不一致的劳动恐怕有同样的行为,行为并不是归某服务独有的,因而作为被定义为<system.serviceModel>节的子节,能够被差异的劳动引用,他的概念有个别像服务,外面是带s的,里面是不带s的,终归可能有不少的一颦一笑定义嘛。

 

以下这几个安顿是我们亟须求做的,我们从代码中能够看出以上三种配备相应语句:

接下去第②步,建立元数据调换终结点,建立的地点和我们刚刚建立的终结点地方相同,可是属性是一定的,大小写都不能够写错。

到此地,配置文件就写完了。大家把它内置程序里面去,打开上一篇中国建工业总会公司立的服务端程序,为顺序添加一个安顿文件

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

建立了表现今后,要让大家刚刚建立的劳动去引用他,用<service>的behaviorConfiguration属性:

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

(1) 依照服务达成类配置一个服务(瑟维斯Host)。

(2) 钦赐2个营地址(如若终结点中钦赐了相对地址,这步能够简不难单)。

(3) 建立一个终结点,并为其内定地方、绑定和劳动协定。

(4) 建立3个元数据沟通终结点。

(5) 为服务丰盛二个行事来启用元数据交流。

到那里,集散地址的有些已经做到,对应代码中的地点你找到了么?

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

host.Open();  

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

host.Close(); 
http://localhost:8000/MyService