[安安分分学WCF] 第壹篇 在IIS中存放服务

赤诚学WCF

目录图:

其三篇 在IIS中过夜服务

起名 1

 

引入jar包:

通过前两篇的读书,大家通晓了什么搭建1个最简便的WCF通讯模型,包涵定义和得以实现服务协定、配置服务、寄宿服务、通过抬高服务引用的章程安插客户端并访问服务。我们对WCF的编制程序生命周期有了八个最主题的询问。

    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

 

 

在前两篇中示范的例子,一定要力求背着做下去,包含源程序、配置文件都要背着一行行的手写下去,那样才能有深远的体味。WCF的文化零散复杂,必须脚踏实地的上学和练习。假使您还并未形成精晓于胸,未来神速翻回到把例子再做一回。

1:Application类

 

package com.imddy.ttdubbo.springsupport;

public class Application {
    private String id;
    private String name;
    private String version;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    @Override
    public String toString() {
        return "Application [id=" + id + ", name=" + name + ", version=" + version + "]";
    }
}

今日让大家多少尖锐一些,理解一些有关住宿的新知识:在IIS中过夜服务。

2:ApplicationBeanDefinitionParser类

 

package com.imddy.ttdubbo.springsupport;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class ApplicationBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    private final Class<?> beanClass;

    private final boolean required;

    public ApplicationBeanDefinitionParser(Class<?> beanClass, boolean required) {
        this.beanClass = beanClass;
        this.required = required;
    }

    protected Class getBeanClass(Element element) {
        return Application.class;
    }

    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        String id = element.getAttribute("id");
        String name = element.getAttribute("name");
        String version = element.getAttribute("version");
        if (StringUtils.hasText(id)) {
            bean.addPropertyValue("id", id);
        }
        if (StringUtils.hasText(name)) {
            bean.addPropertyValue("name", name);
        }
        if (StringUtils.hasText(version)) {
            bean.addPropertyValue("version", version);
        }
    }
}

在前两篇的例子中,大家树立了1个控制台应用程序来作为劳动的宿主,那种寄宿情势叫做”自托管”,即WCF服务和应用程序是紧凑的。那种寄宿方式有
一些亮点,他供给最少的框架帮助(只供给1个控制台应用程序就可以了,随地建立,四处运营),由此配置和应用都以最简便的,其余通过控制台程序仍是能够对
WCF服务运作中生出的一无可取举行蹲点,在开发服务等级,这种办法能提供调节和测试的有利。

3:Registry类

 

package com.imddy.ttdubbo.springsupport;

public class Registry {
    private String id;
    private String address;
    private Integer port;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }

    @Override
    public String toString() {
        return "Registry [id=" + id + ", address=" + address + ", port=" + port + "]";
    }
}

只是,假若作为最后产品陈设,自托管的下榻格局就不那么方便,应用程序比较框架(IIS、Windows服务等)是不安定的,WCF与应用程序共享
生命周期,应用程序关闭后WCF也会告一段落。还有众多特性诸如进程回收、空闲关闭等自托管都以不援救的。由此,为了使大家的WCF符合产品级其他渴求,应该
为其选择1个更安定、伸缩性更好的宿主。

4:RegistryBeanDefinitionParser类

 

package com.imddy.ttdubbo.springsupport;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class RegistryBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    protected Class getBeanClass(Element element) {  
        return Registry.class;  
    }

    protected void doParse(Element element, BeanDefinitionBuilder bean) {  
        String id = element.getAttribute("id");
        String address = element.getAttribute("address");
        String port = element.getAttribute("port");
        if (StringUtils.hasText(id)) {  
            bean.addPropertyValue("id", id);  
        }  
        if (StringUtils.hasText(address)) {  
            bean.addPropertyValue("address", address);  
        }  
        if (StringUtils.hasText(port)) {  
            bean.addPropertyValue("port", Integer.valueOf(port));  
        }
    }
}

除了自托管,WCF还足以住宿于IIS、Windows服务、Windows进度激活服务(WAS)中。相比盛行的是在IIS和Windows进程激活服务寄宿。

5:TtdubboNamespaceHandler类

 

package com.imddy.ttdubbo.springsupport;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class TtdubboNamespaceHandler extends NamespaceHandlerSupport{

    public void init() {
        // TODO Auto-generated method stub
        registerBeanDefinitionParser("application", new ApplicationBeanDefinitionParser(Application.class, true));
        registerBeanDefinitionParser("registry", new RegistryBeanDefinitionParser());
    }

}

在IIS中过夜,需求IIS5.1或更高版本的帮助,IIS会为我们管理ServiceHost(还记得他吧,看率先篇中的代码),同时为大家提供
进程回收、空闲关闭、进度运转情况监视等性格辅助,我们只要求把劳动相关的文书按照一定的团队措施放入IIS的托管中(就像建立一个网站应用程序或编造目
录),IIS会为大家管理整个。那种托管受到支撑的种类广大,从Windows XP SP2
到 WIndows Server
2010,所以它充裕流行。不过她也有失常态,它不得不承受http协议的绑定,对于tcp、管道、MSMQ都是不支持的。

6:resources目录下开创META-INF目录

 

7:spring.handlers

从IIS7早先,提供了所谓Windows进度激活服务(WAS)
的职能,假诺把WCF寄存在WAS中,就能够支撑具备的绑定协议(TCP等),像MSMQ那样的商谈,在内网和.Net编制程序模型下有非常的大的性质优势,因而WAS应该会变成以往WCF寄宿的重中之重格局,可是IIS7须求Windows
Vista以上版本的种类才能支撑,他的普及只怕尚需时间吧。

http\://ttdubbo.oschina.net/schema/ttdubbo=com.imddy.ttdubbo.springsupport.TtdubboNamespaceHandler

 

8:spring.schemas

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

http\://ttdubbo.oschina.net/schema/ttdubbo.xsd=META-INF/ttdubbo.xsd

 

9:ttdubbo.xsd (此文件名可依据 定义的竹签起名)

尝试环境在表明一(Wissu)下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://ttdubbo.oschina.net/schema/ttdubbo"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:tool="http://www.springframework.org/schema/tool"
    targetNamespace="http://ttdubbo.oschina.net/schema/ttdubbo">


   <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>


    <xsd:complexType name="applicationType">
        <xsd:attribute name="id" type="xsd:ID">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="name" type="xsd:string" use="required">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The application name. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="version" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The application version. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>


    <xsd:complexType name="registryType">
        <xsd:attribute name="id" type="xsd:ID">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="address" type="xsd:string" use="required">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The registry address. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="port" type="xsd:string" use="optional">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The registry default port. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>


    <xsd:element name="application" type="applicationType">
        <xsd:annotation>
            <xsd:documentation><![CDATA[ The application config ]]></xsd:documentation>
        </xsd:annotation>
    </xsd:element>

    <xsd:element name="registry" type="registryType">
        <xsd:annotation>
            <xsd:documentation><![CDATA[ The registry config ]]></xsd:documentation>
        </xsd:annotation>
    </xsd:element>

</xsd:schema>

Windows 7 家庭高级版 SP1

10:最先测试:

IIS7

  成立applicationContext.xml配制文件,引入ttdubbo的Namespaces

Visual Studio 2010 旗舰版 SP1

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:ttdubbo="http://ttdubbo.oschina.net/schema/ttdubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
        http://ttdubbo.oschina.net/schema/ttdubbo http://ttdubbo.oschina.net/schema/ttdubbo.xsd">

    <ttdubbo:application id="app1"  name="ttdubboTest" version="0.0.1"/>    
    <ttdubbo:registry id="reg1" address="192.168.1.101" port="80" />

</beans>

 

12:main方法

老实的求学,大家昨天不依靠IDE匡助建立的品类,完全手写三个投宿于IIS的劳动。

package com.imddy.ttdubbo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.imddy.ttdubbo.springsupport.Application;
import com.imddy.ttdubbo.springsupport.Registry;

public class APP {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Application application1 = (Application) context.getBean("app1");
        System.out.println(application1.toString());

        Registry registry1 = (Registry) context.getBean("reg1");
        System.out.println(registry1.toString());

        System.out.println("Hello World!");
    }

}

 

注:假若不成功,要求手动引入一下

  1. 为IIS应用建立物理位置

起名 2

IIS应用程序必要映射到地头驱动器的四个大体路径上,大家先把它建好。

本身把这一个文件夹建立在了C:\WCF\下,取名为IISService。(HelloWCF是大家在前两篇中国建工业总会公司立的,还记得么)

 起名 3

 

13:打包后别的连串得以直接行使

  1. 树立IIS应用程序

 

 物理路径建好了,现在我们在那些地方上创造一个应用程序。点击起首->控制面板,在品种中找到管理工科具,然后打开IIS。

起名 4

 

进行右侧的节点,在暗中同意网站节点上点击右键,采用“添加应用程序”

起名 5

 

为应用程序钦命2个小名,这几个能够随意起的,这几个名字将变为现在服务地点的一有的,笔者把它起作IISService,物理路径就分选我们刚刚建立的公文夹。

起名 6

 

点击分明,IIS应用程序就建好了,大家能够看出在暗许网站下多了这么些应用程序,可是里面还什么都没有。

起名 7

 

  1. 确立服务文件

作者们供给遵照IIS宿主的渴求确立多少个公文放到IIS中才能承载起大家的劳动,当然服务的连带消息也是描述在那一个文件中的。

(1) svc文件。

svc正是service的情致了,我们供给首先创造四个XXX.svc的文件放到IIS应用程序目录下,那些文件是劳动的输入,客户端必要这些文件的地址来拜会服务(当然也席卷原数据调换)。

咱俩来手动建立那一个文件,打开VS2009,接纳文件菜单->新建->文件。在不荒谬栏目中,选择3个文件文件,然后点击”打开”按钮。

起名 8

 

那应该是个svc文件,而不是.txt文件,所以大家另存一下,另存的时候要留心保存类型选为全体文件。作者把那一个文件起名为HelloWCFService.svc,那么些名字可以随意起,那一个名字也将变成服务地点的一有的。保存地方正是我们正好创设IIS应用程序的职位。

起名 9

 

现在我们来编排那些文件的剧情,很简短,就唯有一行代码。

[html] 起名,view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <%@ServiceHost  class=”attribute”>language=c#  class=”attribute”>Debug=”true”  class=”attribute”>Service= class=”attribute-value”>”LearnWCF.HelloWCFService”% class=”tag”>>  

被<%%>框住的表示那几个是3个劳动器端包罗,@ServiceHost
标签表示那是个WCF的服务,联想一下前两篇代码中的ServiceHost
对象。language=c#
表示我们用C#言语来写代码,Debug=true顾名思义了,最重要的是Service那个特性,他代表那一个服务的兑现类是什么样,那里要用完全限定名,
即要包涵取名空间。作者起了一个命名空间名LearnWCF,大家把劳务概念都放在那些命名空间下,后边的HelloWCFService便是劳动的贯彻类
了。大家接下去要去完善那么些类的始末。

能够看看。.svc文件就相当于二个向导,帮大家在IIS宿主中找到服务的职分,具体的代码,我们能够写在另四个地点(其实也能够写在svc文件中,不推荐)。

 

把写的情节保留一下,大家继承发展。

接下去大家要写这几个定义服务的类公事了。不过在那前边,大家先为类公事建立三个存放的职位,IIS的代码文件应当存放在IIS应用程序目录的App_Code子目录下,所以大家先把那一个文件夹建立起来。

起名 10

能够观望我们刚刚确立的HelloWCFService.svc已经被识别为WCF服务了。

 

(2) cs文件

再次来到VS二〇一〇,依然文件->新建->文件,选择文本文件。

这一次大家要建立的是类公事,其名字为HelloWCFService.cs,注意另存为的时候要把保存类型选为全体文件,路径要选拔大家刚创建的App_Code文件夹

编写这一个文件,大家在此间定义和促成劳务协定,应该很熟习吧,尝试着背着写下来呢。

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. using System;  
  2. using System.ServiceModel;  
  3.   
  4. namespace LearnWCF  
  5. {  
  6.     [ServiceContract]  
  7.     public  class=”keyword”>interface IHelloWCF  
  8.     {  
  9.         [OperationContract]  
  10.         string HelloWCF();  
  11.     }  
  12.   
  13.     public  class=”keyword”>class HelloWCFService : IHelloWCF  
  14.     {  
  15.         public  class=”keyword”>string HelloWCF()  
  16.         {  
  17.             return  class=”string”>”Hello WCF!”;  
  18.         }  
  19.     }  
  20. }  

这么些代码应该很熟习的打出去,借使对那段代码还有哪些不亮堂的地点,飞快翻回第壹篇复习一下。

 

保留一下,大家后续进步

 

(3)web.config文件

笔者们早就很了解,还必要一个配置文件,在中间安插终结点、服务、行为等等的音讯。那几个布局文件和我们事先建立的差不多相同。

还是回到VS二〇一〇,如故新建一个文本文件,另存为web.config。这一个文件名,是不能够改的,保存路径是我们创造的IIS应用程序IISService的目录下(和svc保存在共同)

起名 11

先把她写下来,再做表达:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <configuration class=”tag”>>  
  2.   < class=”tag-name”>system.serviceModel class=”tag”>>  
  3.     <services class=”tag”>>  
  4.       <service  class=”attribute”>name= class=”attribute-value”>”LearnWCF.HelloWCFService”  class=”attribute”>behaviorConfiguration= class=”attribute-value”>”metadataExchange” class=”tag”>>  
  5.         < class=”tag-name”>endpoint address= class=”attribute-value”>”” binding= class=”attribute-value”>”wsHttpBinding”  class=”attribute”>contract= class=”attribute-value”>”LearnWCF.IHelloWCF” class=”tag”>/>  
  6.         < class=”tag-name”>endpoint address= class=”attribute-value”>”mex”  class=”attribute”>binding= class=”attribute-value”>”mexHttpBinding”  class=”attribute”>contract= class=”attribute-value”>”IMetadataExchange” class=”tag”>/>  
  7.       </service class=”tag”>>  
  8.     </services class=”tag”>>  
  9.     <behaviors class=”tag”>>  
  10.       < class=”tag-name”>serviceBehaviors class=”tag”>>  
  11.         < class=”tag-name”>behavior name= class=”attribute-value”>”metadataExchange” class=”tag”>>  
  12.           < class=”tag-name”>serviceMetadata  class=”attribute”>httpGetEnabled= class=”attribute-value”>”true” class=”tag”>/>  
  13.         </ class=”tag-name”>behavior class=”tag”>>  
  14.       </ class=”tag-name”>serviceBehaviors class=”tag”>>  
  15.     </behaviors class=”tag”>>  
  16.   </ class=”tag-name”>system.serviceModel class=”tag”>>  
  17. </configuration class=”tag”>>  

本条布局文件和我们事先写的有一部分差异之处:

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

2)
<Service>标签没有了集散地址的描述,在IIS寄宿中,服务集散地址是由IIS负责钦命的。例如本例中劳动的营地址为

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. http://localhost/IISService/HelloWCFService.svc  

3)
终结点的地方内定为了空,表示就动用服务集散地址作为终结点地址,当然这里也足以钦点二个针锋绝对地址,然则不可能钦点相对地址,必须服从IIS钦命的营地址。

另各地方并没有怎么差别,尤其注目的在于钦定服务完结类和协定接口类的时候自然要带上命名空间,那是二个万分不难犯的错误。

 

保留,马到成功

  1. 完成

到此地,在IIS中的寄宿就形成了,很不难,贰个IIS应用程序,一个文件。当然那只是最简易的意况。

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

老艺术,在浏览器里面看一下,是或不是打响了。

IIS寄宿的劳动地点格式:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

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

所以我们以此事例的劳动地点应该是:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. http://localhost/IISService/HelloWCFService.svc  

    不出意外,意况如图

起名 12

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

 

  1. 总结。

这一篇我们学习了什么在IIS中寄宿WCF服务,必备的成分计算如下几点:

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

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

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

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

(5) 保持IIS为运营状态。

发表评论

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

网站地图xml地图