WCF编程系列(六)以编程方式配置终结点
示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务。而关于终结点的配置我们都是通过配置文件来完成的。在本讲中,我们将直接使用编程方式来配置终结点。
ServiceHost类
即服务宿主类,它为我们的服务提供一个运行环境。ServiceHost的构造函数有三个重载:
ServiceHost() 使用无参数的构造必须要有相应的配置文件设置。
ServiceHost(Object,Uri[]) Object参数为一个服务类的实例(如示例一中的FirstService类),Uri[]参数指定服务终结点的默认基地址,对应于我们配置文件中的<host><baseAddress>配置节点下设置。此构造函数使用于”单实例”的服务。
ServiceHost(Type,Uri[]) Type参数指定服务的类型(使用typeof获取),对应于配置文件中<service>配置节点的name属性,如示例一中的<service name="Xfrog.Study.WCF.FirstService"…>,Uri[]参数指定服务终结点的默认基地址。
ServiceHost.AddServiceEndPoint方法
顾名思义,此方法用于向宿主添加一个服务终结点,该方法有8个重载,但实际上可区分为两个版本:三参数版本和四参数版本,三参数版本中,三个参数依次传入终结点的契约类型、绑定及地址,其中契约类型可以使用String类型传入服务契约的全局限定名(如示例一中的"Xfrog.Study.WCF.IFirstService",也可以使用typeof操作符来传入契约的类型(Type);绑定参数传入一个Binding对象,该对象可以通过预定义绑定类型来实例化;地址参数可以使用String类型传入也可以使用Uri类型实例传入,与使用配置文件相似,地址可使用绝对地址或相对地址。由于第一、三参数分别有两个重载,所以三参数版本对应有6个重载版本。
四参数的版本,除了前述三个参数外,第四个参数为一个Uri类型,该地址表示一个服务的侦听地址,即服务通过该地址来侦听客户端的请求。所以四参数的版本实际上是提供了“多个终结点在同一个地址上侦听”的功能。
示例三
通过编程方式为示例一添加终结点:
1.复制实例一文件夹,将其改名为XfrogWCFStudy003
2.打开Host项目下的App.config文件,屏蔽掉配置内容:
-
<?xml version="1.0" encoding="utf-8" ?>
-
<configuration>
-
<!--
-
<system.serviceModel>
-
<services>
-
<service name="Xfrog.Study.WCF.FirstService" behaviorConfiguration="behaviorConfiguration">
-
<host>
-
<baseAddresses>
-
<add baseAddress="http://localhost:8000/"/>
-
</baseAddresses>
-
</host>
-
<endpoint address="" binding="basicHttpBinding" contract="Xfrog.Study.WCF.IFirstService"></endpoint>
-
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
-
</service>
-
</services>
-
<behaviors>
-
<serviceBehaviors>
-
<behavior name="behaviorConfiguration">
-
<serviceMetadata httpGetEnabled="falses"/>
-
</behavior>
-
</serviceBehaviors>
-
</behaviors>
-
</system.serviceModel>
-
-->
-
</configuration>
3.修改Host项目Program.cs代码如下:
-
using System;
-
using System.Collections.Generic;
-
using System.Text;
-
using System.ServiceModel;
-
using Xfrog.Study.WCF;
-
namespace Host
-
{
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
using (ServiceHost host = new ServiceHost(typeof(FirstService)))
-
{
-
host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");
-
host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));
-
host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
-
host.Open();
-
Console.WriteLine("服务已启动,按任意键中止...");
-
Console.ReadKey(true);
-
host.Close();
-
}
-
}
-
}
-
}
示例四
1.通过编程方式启用元数据
2.获取终结点信息
Program.cs代码如下,请参照MSDN了解类的使用方法
-
using System;
-
using System.Collections.Generic;
-
using System.Text;
-
using System.ServiceModel;
-
using Xfrog.Study.WCF;
-
using System.ServiceModel.Description;
-
namespace Host
-
{
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
using (ServiceHost host = new ServiceHost(typeof(FirstService)))
-
{
-
//启用元数据
-
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
-
smb.HttpGetUrl = new Uri("http://localhost:8000/mex");
-
smb.HttpGetEnabled = true;
-
host.Description.Behaviors.Add(smb);
-
host.AddServiceEndpoint("Xfrog.Study.WCF.IFirstService", new BasicHttpBinding(), "http://localhost:8000/");
-
host.AddServiceEndpoint(typeof(IFirstService), new NetTcpBinding(), new Uri("net.tcp://localhost:8001"));
-
host.AddServiceEndpoint(typeof(IFirstService), new NetNamedPipeBinding(), "net.pipe://localhost/");
-
host.Open();
-
//获取终结点信息
-
foreach (ServiceEndpoint point in host.Description.Endpoints)
-
{
-
Console.WriteLine("终结点:");
-
Console.WriteLine("\t地址: {0}", point.Address.ToString());
-
Console.WriteLine("\t绑定: {0}", point.Binding.ToString());
-
Console.WriteLine("\t契约: {0}", point.Contract.ToString());
-
KeyedByTypeCollection<IEndpointBehavior> behaviors = point.Behaviors;
-
foreach (IEndpointBehavior behavior in behaviors)
-
{
-
Console.WriteLine("Behavior: {0}", behavior.ToString());
-
}
-
}
-
Console.WriteLine("服务已启动,按任意键中止...");
-
Console.ReadKey(true);
-
host.Close();
-
}
-
}
-
}
-
}