您的位置:知识库 » .NET技术

WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解

作者: Frank Xu Lei  来源: 博客园  发布时间: 2009-04-01 00:11  阅读: 6933 次  推荐: 0   原文链接   [收藏]  
【3】自定义宿主的开发和配置过程:

    我们这里使用的控制台程序为托管宿主,我们这里讲解托管宿主的代码编写和配置文件的设置过程。

3.1】托管宿主程序的创建:

   使用VS2008新建控制台应用程序,非常简单,选择新建项目-控制台程序,即可。

3.2】托管宿主代码编写:

   这里要添加对WCF服务类库项目的引用,另外要引用ServiceModel程序集。ServiceHost类位于ServiceModel命名空间下。这里比较重要的步骤就是,定义一个ServiceHost实例,定义地址,定义终结点使用ABC地址、契约、绑定。

代码如下:

 //反射方式创建服务实例,
            
//Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
            using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))
            {
                
//相同的服务注册多个基地址
                
//添加服务和URI,用户资源标识符
                Uri tcpAddress = new Uri("net.tcp://localhost:8001/WCFService");
                Uri httpAddress 
= new Uri("http://localhost:8002/WCFService");
                Uri pipeAddress 
= new Uri("net.pipe://localhost:8002/WCFService");
                host.AddServiceEndpoint(
typeof(WCFService.IWCFService), new NetTcpBinding() , tcpAddress);
                host.AddServiceEndpoint(
typeof(WCFService.IWCFService), new WSHttpBinding(), httpAddress);
                host.AddServiceEndpoint(
typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeAddress);
                
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
                if (host.State !=CommunicationState.Opening)
                host.Open();
                
//显示运行状态
                Console.WriteLine("Host is runing! and state is {0}",host.State);
                
//等待输入即停止服务
                Console.Read();
            
            
            }

       值得注意的是定义终结点的代码可以由配置文件的定制来实现。 if (host.State !=CommunicationState.Opening)语句是为了判断是否以及打开连接,如果尚未打开,host.Open(); 就打开侦听端口。
       Console.Read()语句是阻塞进程,使得宿主程序可以一直运行下去。直到用户输入数据。          

3.3】配置文件的定制:

    要使WCF宿主程序能够正确运行,还需要编辑配置文件信息。所有的WCF服务相关的配置信息都处于app.config文件的  节点内。下面我们就来详细介绍一下详细的配置过程。

    3.3.1【服务结点配置】     

    指定公布服务的类型和行为。服务的行为要在配置文件中给出,我们下面会给出详细的说明。这里的WCF服务就是我们实现服务契约的WCF服务的类名WCFService。

    服务的终结点包含ABC,地址、绑定(通信协议,其实很拗口)、契约三个部分。地址包括:通信协议、机器地址、端口、服务名。契约就是服务契约。我们这里配置了连个终结点,分别使用HTTP协议和TCP协议。端口分别是8001和8002。服务地址必须不同,所以设置了两个不同的端口。具体的配置代码如下:

<endpoint 
          address
="http://localhost:8001/WCFService" 
          binding
="wsHttpBinding" 
          contract
="WCFService.IWCFService">
        
endpoint>
<endpoint adress="net.tcp://localhost:8002/WCFService" 
          binding
="netTcpBinding" 
          contract
="WCFService.IWCFService">
endpoint>

   如果终结点里不设置地址,我们必须配置文件里给出相应的基地址配置,基地址包括:通信协议(绑定)、机器名或IP、端口。这样WCF服务的托管宿主启动后,状态才能成功打开。配置信息如下:

<host>
          
<baseAddresses>
            
<add baseAddress="http://localhost:8001/"/>
            
<add baseAddress="net.tcp://localhost:8002/"/>
          </
baseAddresses>
</host>

 

    3.3.2【元数据终结点配置】

    如果我们希望WCF可以被客户端查找和引用,我们就要设置相应的元数据交换节点,来约束WCF服务的元数据交换行为。绑定(通信协议)和我们上面设置的服务终结点对应,这样客户端可以以不同的方式获得元数据,数据交换契约为IMetadataExchange,具体代码如下:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />

    这样客户端可以通过服务地址获得我们公布的WCF服务的元素据信息,反序列化创建本地的对应的数据类、服务等类。

    3.3.3【行为结点配置】

    另外我们可以在这里配置服务的行为,在配置文件里的<serviceBehaviors>节点下。定义行为名称,方便服务引用。是否可以通过httpGet方式获取服务元素据,是否显示服务异常的详细信息,在这里都可以进行设置。

    <behaviors>
      
<serviceBehaviors>
        
<behavior name="WCFService.WCFServiceBehavior">
          
<serviceMetadata httpGetEnabled="true" />
          
<serviceDebug includeExceptionDetailInFaults="false" />
        
behavior>
      
serviceBehaviors>
    
behaviors>

   这里定义的服务行为就是在上面被服务节点引用的,记住名称一定要匹配。否则会出现找不到服务行为的异常,程序将无法运行。以上的方式可以通过编程方式实现,但是相对来说配置文件使用简单,编程方式复杂,需要代码,但是功能强大,我们可以编程动态控制服务运行的状态。

   配置完全后就可以编译,运行托管服务宿主程序。托管宿主启动正常:

0
0
标签:WCF

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻