服务
服务是一组公开功能的集合。
服务内部包含了如语言、技术、版本与框架等概念,服务之间的交互只允许使用规定的通信模式
外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述可用的功能及服务可能采用的通信方式
WCF不允许客户端直接与服务交互,客户端总是使用代理将调用转发给服务 ,WCF允许客户端跨越执行边界与服务通信,如跨应用程序域、进程甚至网络。
WCF要求客户端对本地对象还是远程对象都保持一致的编程模型,而不用考虑服务的位置
WCF对本地对象还是远程对象都使用代理调用服务,大大简化了应用程序的编程模型,使用代理可以拦截WCF的请求,增加WCF的价值
终结点
服务与地址、绑定和契约有关。
地址定义了服务的位置,绑定定义了服务的通信方式,契约则定义了服务的内容。称为”服务的ABC“。
WCF用终结点表示这样一组关系。终结点是地址、绑定和契约的一种混合品。
每一个终结点都包含这三个元素,而宿主则负责公开终结点。
每个服务至少公开一个业务终结点,每个终结点有且只有一个服务契约。
配置终结点
1.以配置文件的方式配置终结点
Program.cs文件
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService)); 6 Console.ForegroundColor = ConsoleColor.DarkYellow; 7 8 host.Open(); 9 Console.WriteLine("服务启动成功......"); 10 11 int i = 0; 12 foreach (ServiceEndpoint endpoint in host.Description.Endpoints) 13 { 14 i++; 15 Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}",i, endpoint.Name, endpoint.Address, endpoint.Binding,Environment.NewLine); 16 } 17 18 Console.Read(); 19 } 20 }
App.config文件
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 5 </startup> 6 <system.serviceModel> 7 <services> 8 <service name="WCF.Service.HelloWorldService"> 9 <endpoint address="http://localhost:8000/HelloWorldService" contract="WCF.Service.IHelloWorldService" binding="wsHttpBinding"></endpoint> 10 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint> 11 <host> 12 <baseAddresses> 13 <add baseAddress="http://localhost:8000"/> 14 </baseAddresses> 15 </host> 16 </service> 17 18 </services> 19 <behaviors> 20 <serviceBehaviors> 21 <behavior> 22 <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false --> 23 <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 24 <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> 25 <serviceDebug includeExceptionDetailInFaults="false"/> 26 </behavior> 27 </serviceBehaviors> 28 </behaviors> 29 </system.serviceModel> 30 </configuration>
2.以编程方式配置终结点
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //编程方式配置终结点 6 Uri baseAddress = new Uri("http://localhost:8000"); 7 ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService), baseAddress); 8 WSHttpBinding binding = new WSHttpBinding(); 9 //寻找元数据 10 ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 11 //获取宿主的行为列表 12 if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为 13 { 14 metadataBehavior = new ServiceMetadataBehavior(); 15 metadataBehavior.HttpGetEnabled = true; 16 host.Description.Behaviors.Add(metadataBehavior); 17 } 18 19 host.AddServiceEndpoint(typeof(WCF.Service.IHelloWorldService), binding, "HelloWorldService"); 20 host.AddServiceEndpoint(typeof(IMetadataExchange), binding , "mex"); 21 22 Console.ForegroundColor = ConsoleColor.DarkYellow; 23 24 host.Open(); 25 Console.WriteLine("服务启动成功......"); 26 27 int i = 0; 28 foreach (ServiceEndpoint endpoint in host.Description.Endpoints) 29 { 30 i++; 31 Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}", i, endpoint.Name, endpoint.Address, endpoint.Binding, Environment.NewLine); 32 } 33 34 Console.Read(); 35 } 36 }