当服务部署之后迁移了服务器,基地址发生变化,我们必须修改源程序并重新编译重新部署才能实现这个要求。对于其他的配置选项亦是如此。这对于产品环境是不能接受的。好在WCF提供针对这个问题的解决方案:配置文件。
我们把对服务的配置写在应用程序的配置文件中(IIS程序是web.config 其他程序是app.config),当配置发生改变的时候我们就不用重新编译程序集了。
还是以之前的例子为例,首先贴上完整的配置文件(app.config)代码:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="HelloWCF.HelloWCF" behaviorConfiguration="metaExchange">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/MyService"/>
</baseAddresses>
</host>
<endpoint address="HelloWCF" binding="wsHttpBinding" contract="HelloWCF.IHelloWCF"/>
<endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metaExchange">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
本人使用的是Win10,VS2015环境,首先在原服务端添加一个配置文件, 右键点击项目->添加->新建项->应用程序配置文件,名字系统会起好(app.config),并把上面的配置写进去,保存。
主要内容讲解:
(1)首先是添加<service>标签的name属性,指定的时候后要用完全限定名(带着命名空间)。
(2)然后添加基地址baseAddresse。
(3)然后配置终结点endpoint,包含三个元素:地址(address)、绑定(binding)和服务协定接口(contract)。
这里的地址是相对地址,也可以指定为空字符串"",此时基地址(即服务地址)就是终结点的地址,还可以指定一个绝对地址,那样他会覆盖基地址,基地址对这个终结点来说就不起作用了。(注意,在使用IIS承载的时候,必须使用相对地址,也就是终结点必须是基地址的子地址,这是由IIS的部署结构决定的。)
(4)允许元数据交换,通过为服务添加一个行为来实现的,行为是用来描述服务的特性的,这里是服务行为,所以用<serviceBehaviors>,交换元数据的行为有固定的标签描述,就是<serviceMetadata>。
(5)服务提供元数据交换方式,让我们刚才建立的服务去引用他,用<service>的behaviorConfiguration属性。
(6)配置元数据交换终结点endpoint,同样包含三个元素,属性固定。
当然,配置文件完成后,原服务器端代码无需再配置,删除即可。main函数中只需留下操作部分,即:
ServiceHost host = new ServiceHost(typeof(HelloWCF));
host.Open();
Console.WriteLine("Service is Ready");
Console.WriteLine("Press Any Key to Terminate...");
Console.ReadLine();
host.Close();
保存运行后,应该与之前结果一致。
总结:这只是最简单的配置文件的编写,接触到了服务、终结点和行为的配置方法。配置文件的元素还有许多,像绑定、安全性等特性,以后慢慢学起。