一、概述
WCF程序必须在宿主上运行,也就是WCF服务必须寄宿在某一个windows的进程中,可以是IIS、控制台程序、窗体程序、WAS以及所有.net程序等程序进程中。在我用VS2013创建WCF服务的时候有四个类型:WCF服务库、WCF服务应用程序、WCF工作流服务应用程序和联合服务库。现在处于初学阶段,主要学习用到的是WCF服务库和WCF服务应用程序,它们有什么区别呢?
1.WCF服务库:相当于一个包含WCF服务的类库,本身不能执行,必须通过别的宿主程序(如控制台程序、WAS等)托管引用后才可以使用,可以提高代码的复用性。
2.WCF服务应用程序:相比之下可以独立运行,基于IIS托管的程序。在开发基于IIS的WCF服务时比较多见,自学的时候也多用这个,在WCF入门一[WCF概述]中就使用过。
IIS的宿主实现在之前讲过,所以不再复述。这里我们先创建一个WCF服务库WcfServiceLibrary,将默认的文件IService1.cs和Service.cs删除,新建一个WCF服务Day.cs会生成Day,cs和IDay.cs两个文件,接口和实现如下:
namespace WcfServiceLibrary { [ServiceContract] public interface IDay { [OperationContract] string ShowDay(int day); } } namespace WcfServiceLibrary { public class Day : IDay { public string ShowDay(int day) { return string.Format("WCF服务返回Day是:{0}", day); } } }
这里我们在新建WCF服务Day.cs的时候VS自动给在配置文件中加上了该服务的信息,也就是终结点的信息。这里和寄宿在IIS中由IIS监听不同,如果没有添加的话需要手动添加在配置文件中或者在程序代码中写终结点的相关配置细信息Behaviors、Address等,不过正常情况下都是依赖配置文件的。
由于控制台程序、窗体程序、windows服务和.net程序等作为宿主都是一样的,可以通过读取配置文件或者代码配置终结点等服务信息来实现。以下主要用控制台程序通过这两点实现WCF宿主。
二、代码配置终结点信息
1.在解决方案下新建一个控制台程序ConsoleApplication。
2.添加引用->解决方案->WcfServiceLibrary.dll。
3.添加引用->程序集->System.ServiceModel。
4.添加代码如下,具体请查看"MSDN ServiceHost":
namespace ConsoleApplication { class Program { static void Main(string[] args) { //创建宿主的基地址 Uri baseAddress = new Uri("http://192.168.3.30:8080/Day"); //创建宿主 using (ServiceHost host = new ServiceHost(typeof(Day), baseAddress)) { //向宿主中添加终结点 host.AddServiceEndpoint(typeof(IDay), new WSHttpBinding(), ""); //将HttpGetEnabled属性设置为true ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; //将行为添加到Behaviors中 host.Description.Behaviors.Add(smb); //打开宿主服务 host.Open(); Console.WriteLine("WCF中的HTTP监听已启动...."); Console.ReadLine(); host.Close(); } } } }
6.启动控制台程序,如果启动不了的话,用管理员身份运行exe,启动WCF服务。
7.新建一个控制台解决方案,并添加地址为http://192.168.3.30:8080/Day的服务引用。之后正常调用服务如下所示:
三、读取配置文件
1、2、3三个步骤同上,更改代码如下,这里是直接读取配置文件中的ServiceHost:
class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(Day)); //打开宿主 host.Open(); Console.Write("WCF中的HTTP监听已启动...."); Console.ReadKey(); host.Close(); } }
在控制台应用程序的配置文件App.Config修改如下,这里的配置项必须要对否则启动会报错。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <services> <service name="WcfServiceLibrary.Day"> <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.IDay" /> <host> <baseAddresses> <add baseAddress="http://192.168.3.30:8080/Day" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
重复同上使用WCF服务。
四、总结
实现控制台宿主、winform宿主和windows服务宿主的代码就是以上两种方式,虽然宿主不同但是方法其实是相同的,可以根据以上的控制台宿主的实现来实现其他同类型的宿主,但是相比之下用IIS服务作为宿主还是最为主要的手段,更加的方便快捷。
五、说明
这个随笔是我自己学习流程的一个记录,和大家共勉。