WCF服务编程(5)——通过Configure()方法配置终结点

一、引言

.net4.5之前,当使用编程方式配置WCF时,宿主(ServiceHost)代码通常需要和托管进程代码耦合在一起,这样无疑增加了代码维护难度,降低了代码的可读性。在.net4.5之后,WCF提出了Configure()方法,提供了一个不依赖托管进程的方式来配置服务。无论托管环境如何,Configure()方法允许我们为它所在范围内的服务终结点定义配置。

二、Configure()方法中添加终结点

我们需要在服务类中实现Configure()方法,并且该方法应该被声明成publicstatic,否则无法被调用。当我们在托管进程的代码中,new 宿主对象之后,WCF会自动进入Configure()中的代码。如下,我们在服务类Service1中实现了Configure()方法,

 public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            WSHttpBinding wsBinding = new WSHttpBinding();
            config.AddServiceEndpoint(typeof(IService1), wsBinding, "");
            //必须设置服务HttpGetEnabled 为true的行为,否则无法调用服务
            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true});
        }
        public void DoWork()
        {
            MessageBox.Show("我被调用了");
        }
}


三、Configure()方法中添加默认终结点

我们也可以通过调用configEnableProtocol()方法来为服务增加默认的终结点,该方法接收一个绑定对象,生成的默认类名称按照之前介绍的规则,是服务契约和绑定类名称的组合。

 public static void Configure(ServiceConfiguration config)
        {
            WSHttpBinding wsBinding = new WSHttpBinding();
            //config.AddServiceEndpoint(typeof(IService1), wsBinding, "");
            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.EnableProtocol(new WSHttpBinding()); 
 
        }


四、LoadFromConfiguration()读取配置文件

需要特别注意的是,当我们在服务类中定义了Configure()方法之后,WCF将不会加载配置文件中的配置,也就是说此时只能通过编码的方式对WCF进行配置。如果我们需要加载配置文件中的配置,只能调用LoadFromConfiguration()方法。

如下我们在app.config中配置了终结点和behavior信息(因为我们在代码中添加了http类型的基地址,所以配置文件中不需要再加基地址)。

<system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="WindowsFormsApplication1.Service1">
                <endpoint address="config" binding="basicHttpBinding" contract="WindowsFormsApplication1.IService1" >
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
</system.serviceModel>


 

如果我们需要下载配置文件中的配置,则在Configure()方法中调用LoadConfiguration()方法:

  public static void Configure(ServiceConfiguration config)
        {
            WSHttpBinding wsBinding = new WSHttpBinding();
            //config.AddServiceEndpoint(typeof(IService1), wsBinding, "");
            //config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            //config.EnableProtocol(new WSHttpBinding()); 
            config.LoadFromConfiguration();
 
        }


 

 

 

 


评论