今天来看看WCF的配置方法。

上图整理了服务配置过程中所用到的基本的元素,大致的步骤主要是首先要在调用服务的程序集中添加服务的一个引用,然后添加一个service并指定服务的名称、终结点,如果添加了behavior(行为)的配置,那么也需要添加一个behaviorConfiguration的配置信息。在添加一个service时会在其中指定终结点的信息,终结点说的就是服务的具体信息访问方式,在终结点中添加服务address及binding信息和contract(服务契约)信息等。在endpoint中添加的binding只是指定了服务绑定的访问方式,例如:basicHttpBinding等,真正的binding配置是需要在另外的binding中添加的,添加好后需要配置在endpoint的bindingConfiguration。下面看一个服务在客户端部署配置的示例。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel> <!--The bindings configuration
We deployed the basichttpbinding.
I added a binding that name is binding1.
The binding1 used the security.
-->
<bindings>
<basicHttpBinding>
<binding name="binding1">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings> <!--The behaviors configuration
I added a serviceBehavior that has nothing configuration in.
-->
<behaviors>
<serviceBehaviors>
<behavior name="service1_behavior"> </behavior>
</serviceBehaviors>
</behaviors> <!--The services configuration
I added a service that behaviorConfiguration is service1_behavior.
This service has an endpoint that added the property and the binding.
-->
<services>
<service name="Wcfservice.Service1" behaviorConfiguration="service1_behavior">
<endpoint address="http://localhost:64921/Service1.svc" name="ServiceReference1_IService1"
binding="basicHttpBinding" bindingConfiguration="binding1" contract="ServiceReference1.IService1"></endpoint>
</service>
</services> </system.serviceModel>
</configuration>

上例将配置信息写入到了xml中,分别添加了一个服务的binding、service和behavior,在添加时往往是自下向上添加,首先添加一个binding配置信息,然后添加相应的behavior行为,最后添加一个service并把绑定信息添加到其中。

service

service主要是用来配置endpoint和host的,它实际上代表了为程序集添加了一个服务的引用,其中的endpoint指定了服务的地址、绑定和协议,host则提供了服务寄宿的方式。
如下配置:

<services>
<service name="Wcfservice.Service1">
<host>
<baseAddresses>
<add baseAddress="http://localhost:64921/ConsoleApplication1"/>
</baseAddresses>
</host>
<endpoint address="http://localhost:64921/WcfService1.IService1" binding="basicHttpBinding"
bindingConfiguration="binding1" contract="ServiceReference1.IService1"></endpoint>
</service>
</services>

在上面的代码中添加了一个service,并为service配置了一个host该host的应用程序即为当前引用服务的程序集。最后添加了一个endpoint,终结点中绑定了URI,URI的地址就是WCF的定义地址,其中的binding是指定了基本的绑定类型,另外还使用contract指定了服务契约的接口。

binding

service是对服务进行的配置,指定了服务的一些配置信息,另外很重要的和service同级还有binding,它是对消息访问方式做的一些配置。
1、绑定方式
分为系统自带的绑定和用户自定义绑定两种,系统自带的绑定包括basicHttpBinding、WcHttpBinding等。
如果系统提供的绑定功能不完全,那么也可以使用用户自定义的绑定功能,可以使用customBinding对象从预先存在的绑定元素中创建新的绑定,也可以通过从Binding派生类来创建完全由用户自定义的绑定。
2、基本功能
绑定除了定义绑定的方式外,还可以指定传输协议的类型、安全性、编码方式和事务等,通过绑定来配置WCF的基本操作类型,这样能够对服务做详细的一些配置,使服务的功能更加健全。

<?xml version=”1.0” encoding=”utf-8” ?>
<configuration>
<system.serviceModel>
<services>
<service name =”WCFService.ServiceClass” behaviorConfiguration=”metadataSupport”>
<host>
<baseAddresses>
<add baseAddress=”net.pipe://localhost/WCFService”/>
<add baseAddress=”net.tcp://localhost:8000/WCFService”/>
<add baseAddress=”http://localhost:8080/WCFService”/>
</baseAddresses>
</host>
<endpoint address=”tcpmex” binding=”mexTcpBinding”
contract=”IMetadataExchange”/>
<endpoint address=”namedpipemex” binding=”
mexNamedPipeBinding” contract=”IMetadataExchange”/>
<endpoint address=”” binding=”wsHttpBinding”
contract=”WCFService.IServiceClass”/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name=”metadataSupport”>
<serviceMetadata httpGetEnabled=”false” httpGetUrl=””/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Behavior

行为属性,行为属性可以控制服务的运行时特性,主要分为服务行为和操作行为,这些行为或特性,可以通过配置runtime属性配置文件,或自定义行为来实现。

<?xml version=”1.0” encoding=”utf-8” ?>
<configuration>
<system.serviceModel>
<services>
<service name =”WCFService.ServiceClass” behaviorConfiguration=”metadataSupport”>
<host>
<baseAddresses>
<add baseAddress=”net.pipe://localhost/WCFService”/>
<add baseAddress=”net.tcp://localhost:8000/WCFService”/>
<add baseAddress=”http://localhost:8080/WCFService”/>
</baseAddresses>
</host>
<endpoint address=”tcpmex” binding=”mexTcpBinding” contract=”IMetadataExchange”/>
<endpoint address=”namedpipemex” binding=”mexNamedPipeBinding” contract=”IMetadataExchange”/>
<endpoint address=”” binding=”wsDualHttpBinding” contract=”WCFService.IServiceClass”/>
<!--<endpoint address=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange”/>-->
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name=”metadataSupport”>
<!--允许客户端侦听服务器日志,在正式运行前最好关闭-->
<serviceDebug includeExceptionDetailInFaults=”true”/>
<serviceMetadata httpGetEnabled=”false” httpGetUrl=””/>
<serviceThrottling maxConcurrentCalls=”10” maxConcurrentInstances=”5” maxConcurrentSessions=”5”/>
<serviceSecurityAudit auditLogLocation=”Application” suppressAuditFailure=”false”/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Note:serviceMetadata 是一种元数据启用功能,它是配置元数据终结点,默认情况下是不公开元数据的,但是可以通过启用配置来公开元数据的终结点。
上面的代码都是使用的是配置文件做的服务的配置部署,另外也可在程序中编写代码来配置部署信息,但是并不赞成这种配置方式,因为这种配置方式不易更改,当你部署到客户环境后就不能再更改内部的代码结构,所以这种方式很不灵活,并不提倡使用这种方式来配置服务,但是可以作为了解,如下代码:

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ServiceReference1.Service1Client)))
{
host.AddServiceEndpoint(typeof(ServiceReference1.IService1),
new WSHttpBinding(), "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior serviceMetadata = new ServiceMetadataBehavior();
serviceMetadata.HttpGetEnabled = true;
serviceMetadata.HttpGetUrl = new Uri
("http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/metadata");
host.Description.Behaviors.Add(serviceMetadata);
} host.Open(); ServiceReference1.IService1 service1 = new ServiceReference1.Service1Client();
service1.GetData(1);
Console.Write("fdsf");
host.Close();
}
}
}
}

上面的代码中使用的是WSHttpBinding方式它支持双工通信,另外上面的宿主方式使用的是ConsoleApplication Host,这种host方式非常简单。在创建宿主程序时,需要为宿主指定宿主服务的类型,这里的类型要使用实现服务的类,最好不要使用接口类型。
创建宿主对象后,接下来为宿主添加了一个服务的终结点,终结点中第一个参数是指定了协议实现的类型,本例使用的是接口协议,所以要配置为相应的接口类型;第二个参数指定了绑定的类型;第三个参数则指定了终结点的URI地址,URI地址要配置服务具体实现的类URL地址。
接下来为宿主添加了一个行为(Behavior),并为行为公开了元数据,这种行为在创建时也可以不强加给服务,也就是说在添加宿主时,服务的行为定义是可选的,也可以不定义。

结语

本文主要针对WCF在客户端进行配置时所使用的基本的配置节做了详细的讨论,主要是Service、Binding和Behavior的应用,另外需要注意的是在客户端进行服务配置时不建议采用代码配置的方法,最好使用xml文件进行发布配置,这样能很好的修改。最后还有在添加WCF时一定要根据不同的类别添加需要的WCF,WCF中有类库和Application两种,它们所针对的Host是不同的,如果是类库的话往往用来配置Console Application作为Host,如果是Application类的往往用来配置网站服务,否则在使用时很容易出错。

来自 http://www.uml.org.cn/zjjs/201503125.asp 
相关参考资料:
http://www.uml.org.cn/zjjs/201503125.asp
http://www.cnblogs.com/weichuo/archive/2008/07/09/1238979.html

WCF配置文件详解的更多相关文章

  1. WCF配置文件详解 【转】

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  2. WCF配置文件详解(一)

    <?xml version="1.0" encoding="utf-8" ?><configuration>    <!-- &l ...

  3. WebConfig配置文件详解

    今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...

  4. Asp.net中web.config配置文件详解(一)

    本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...

  5. quartz配置文件详解

    quartz配置文件详解(转载)     quartz学习总结: 一.关于job:    用Quartz的行话讲,作业是一个执行任务的简单Java类.任务可以是任何Java代码.只需你实现org.qu ...

  6. tomcat配置文件详解

    Tomcat系列之服务器的安装与配置以及各组件详解   tomcat 配置文件详解

  7. ubuntu nginx 安装以及配置文件详解

    1.到nginx官网下载源码包.最好下载稳定版本,nginx官网http://www.nginx.org/ 2.安装nginx依赖包运行命令: sudo apt-get install libssl- ...

  8. Spring配置文件详解 – applicationContext.xml文件路径

    Spring配置文件详解 – applicationContext.xml文件路径 Java编程                 spring的配置文件applicationContext.xml的默 ...

  9. spring配置文件详解--真的蛮详细

    spring配置文件详解--真的蛮详细   转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...

随机推荐

  1. ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

    一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void ...

  2. Android自己主动检測版本号及自己主动升级

    步骤: 1.检測当前版本号的信息AndroidManifest.xml-->manifest-->android:versionName. 2.从server获取版本号号(版本号号存在于x ...

  3. Linux文件编辑命令具体整理

    刚接触Linux,前几天申请了个免费体验的阿里云server,选择的是Ubuntu系统.配置jdk环境变量的时候须要编辑文件. vi命令编辑文件,百度了一下,非常多回答不是非常全面,因此编辑文件话了一 ...

  4. Python 网络爬虫与信息获取(一)—— requests 库的网络爬虫

    1. 安装与测试 进入 cmd(以管理员权限),使用 pip 工具,pip install requests 进行安装: 基本用法: >> import requests >> ...

  5. [Ramda] Create a Query String from an Object using Ramda's toPairs function

    In this lesson, we'll use Ramda's toPairs function, along with map, join, concatand compose to creat ...

  6. 小强的HTML5移动开发之路(41)——jqMobi中Side Menu实现(类似人人网)

    记得以前在做Native App的时候类似于人人网侧边滑动的效果非常的热,很多app仿照该效果进行开发,在jqMobi中也有类似的效果被称为Side Menu.下面我们来一步一步实现该效果. 首先新建 ...

  7. 【t067】补充装备

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Mini进入洞口前自然要先来到镇里的装备店买些装备.买每件装备都需要付出一定的体力点,同时也会获得一定 ...

  8. wpf SnapsToDevicePixels

    原文:wpf SnapsToDevicePixels  可以在您的根元素上将此属性设为 true,以在整个 UI 上启用像素对齐呈现. 对于运行在大于 96 每英寸点数 (dpi) 的设备,像素对 ...

  9. Windows下快速搭建安卓开发环境android-studio

    Windows下快速搭建安卓开发环境android-studio 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 安卓 搭建 Android Windows 快速 环境 Studi ...

  10. 读取和修改xml文件

    如有一个xml文件DownData.xml,内容如下 <?xml version="1.0" standalone="yes"?> <Root ...