C#-WCF Service----WCF入门教程(四)通过Host代码方式来承载服务
之前已经讲过WCF对外发布服务的具体方式。
Host承载,可以是web,也可以是控制台程序等等。比WebService有更大的使用空间。具体承载的简单框图如下:
通过服务终结点,然后通过Host承载这些终结点,这样客户端就可以访问这些服务了。
一个服务可以添加多个终结点,终结点中定义了Address,Binding和Contract。
而且还可以针对终结点定义一定的行为。
下面给出简单实例,通过ServiceHost来承载相关服务。
#region 采用代码方式实现对契约的绑定 Uri baseAddress = new Uri("http://127.0.0.1:9999/"); using (ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress)) { Binding wsBinding = new WSHttpBinding(); NetTcpBinding tcpBinding = new NetTcpBinding(); //提供安全传输 tcpBinding.Security.Mode = SecurityMode.Transport; //需要提供证书 tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; //添加多个服务终结点 //使用指定的协定、绑定和终结点地址将服务终结点添加到承载服务中 ServiceEndpoint svEndpiont = host.AddServiceEndpoint(typeof(ICalculator), wsBinding, "CalculatorService"); //netTcp协议终结点 host.AddServiceEndpoint(typeof(ICalculator), tcpBinding, "net.tcp://127.0.0.1:8888/CalculatorServiceTcp"); #region 添加行为 //元数据发布行为 ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); //支持get请求 behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/CalculatorService/metadata"); //设置到Host中 host.Description.Behaviors.Add(behavior); #endregion host.Opened += delegate { Console.WriteLine("CalculaorService已经启动,按任意键终止服务!"); }; //服务启动 host.Open(); Console.Read(); } #endregion
如果已经很了解这些类型的使用了,后面的内容可以直接略过。
ServiceHost
提供服务的主机。就是服务的承载者。
主要属性:
名称 |
说明 |
获取服务身份验证行为。 |
|
获取所承载服务的授权行为。 |
|
获取所承载服务使用的基址。 |
|
获取服务主机所使用的通道调度程序的集合。 |
|
获取或设置允许服务主机关闭的时间间隔。 |
|
获取或设置允许服务主机打开的时间间隔。 |
|
获取承载服务的单一实例。 |
|
获取指示通信对象当前状态的值。 |
ServiceEndpoint
表示允许服务的客户端查找并与服务通信的服务的终结点。
该服务终结点包含客户端在此终结点进行查找和与服务交互所需的地址、绑定、协定和行为信息。
属性:
名称 |
说明 |
获取或设置服务终结点的终结点地址。 |
|
获取服务终结点的行为。 |
|
获取或设置服务终结点的绑定。 |
|
获取服务终结点的协定。 |
|
获取或设置是否由系统生成服务终结点而不由用户定义服务终结点。 |
|
获取或设置服务终结点侦听的 URI。 |
|
获取或设置传输处理提供给服务的供其侦听的 URI 的方式。 |
|
获取或设置服务终结点的名称。 |
Binding
包含绑定元素,这些元素指定客户端和服务之间的通信所用的协议、传输和消息编码器。
这李只给出几种常见的绑定类型,不深入展开
具体绑定规则根据具体需求而定。
Binding名称 |
Configuration Element |
描述 |
BasicHttpBinding |
basicHttpBinding |
一个指定用符合基本网络服务规范通讯的binding,它用http进行传输,数据格式为text/xml |
WSHttpBinding |
wsHttpBinding |
一个安全的通用的binding,但它不能在deplex中使用 |
WSDualHttpBinding |
wsDualHttpBinding |
一个安全的通用的binding,但能在deplex中使用 |
WSFederationHttpBinding |
wsFederationHttpBinding |
一个安全的通用的支持WSF的binding,能对用户进行验证和授权 |
NetTcpBinding |
netTcpBinding |
在wcf应用程序中最适合跨机器进行安全通讯的binding |
NetNamedPipeBinding |
netNamedPipeBinding |
在wcf应用程序中最适合本机进行安全通讯的binding |
NetMsmqBinding |
netMsmqBinding |
在wcf应用程序中最适合跨机器进行安全通讯的binding,并且支持排队 |
NetPeerTcpBinding |
netPeerTcpBinding |
一个支持安全的,多机交互的binding |
MsmqIntegrationBinding |
msmqIntegrationBinding |
一个用于wcf与现有msmq程序进行安全通讯的binding |
ServiceDescription
表示一个完整的服务的内存中说明,包括服务的所有终结点及其各自地址、绑定、协定和行为的规范。
名称 |
说明 |
获取与该服务关联的行为。 |
|
获取或设置 <service> 配置元素的名称。 |
|
从服务说明获取终结点的集合。 |
|
获取或设置服务的名称。 |
|
获取或设置服务的命名空间。 |
|
获取服务的类型。 |
ServiceMetadataBehavior
控制服务元数据和相关信息的发布。
属性 |
说明 |
获取或设置作为服务元数据的位置的值。 |
|
获取或设置当传输为 HTTP 时用于配置元数据检索的绑定。 |
|
获取或设置一个值,该值指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索。 |
|
获取或设置进行 HTTP/GET 请求的元数据发布的位置。 |
|
获取或设置当传输为 HTTPS 时用于配置元数据检索的绑定。 |
|
获取或设置一个值,该值指示是否发布服务元数据以便使用 HTTPS/GET 请求进行检索。 |
|
获取或设置进行 HTTPS/GET 请求的元数据发布的位置。 |
|
获取或设置用于发布服务元数据的内部 MetadataExporter 对象。 |
主要方法:
其方法很多,Host开启、关闭、终止等,还支持异步操作,以及一些动作前后事件。在这里只列举了最基本几个方法。
名称 |
说明 |
使用指定的协定、绑定和终结点地址将服务终结点添加到承载服务中。 |
|
使通信对象从其当前状态转换到关闭状态。 (继承自 CommunicationObject。) |
|
获取所承载服务的服务凭据、服务身份验证和授权行为。 (继承自ServiceHostBase。) |
|
使通信对象从已创建状态转换到已打开状态。 (继承自 CommunicationObject。) |