文字显示结果
组合搜索  计算机图书分类目录
 
所在位置: 图书 -> 在线试读 -> 精通C# 3.0与.NET 3.5高级编程——LINQ、WCF、WPF、WF 
                 

第24章 通道模型和绑定

24.6 与改进Web服务进行交互的绑定和地址

与基本Web服务相比,改进Web服务新增了安全、身份验证、加密、事务控制、可靠传输等多项内容,使得Web服务功能更加强大。在改进Web服务交互的场景中,绑定和地址的选择都有所不同。本节将介绍与改进Web服务交互时绑定和地址的选择。

24.6.1  场景概述

Web服务自身标准在经历了一段时间发展之后,提出了协议的改进版本,也就是俗称的改进的Web服务。改进的Web服务新增一系列WS-*协议,从而在消息的过程中对安全、事务、可靠传输等方面进行支持。

%说明:改进的Web服务协议由IBM、微软、BEA等多家IT巨头联合推出,所以很快改进的Web服务得到了W3C组织的承认,成为了正式的标准并且被各种技术框架所支持。就.NET框架而言,WSE开发包就是为了支持改进Web服务而提供的。

由于改进Web服务协议的普遍应用,势必然WCF设计小组需要考虑与改进Web服务系统交互的能力。而其结果是WCF可以完全支持与改进Web服务进行消息交互,并且支持一系列的WS-*协议。

24.6.2  改进Web服务协议概述

和其他所有的协议发展一样,改进Web服务协议并没有颠覆基本的Web服务,而是在其基础上添加了一系列的WS-*协议,来支持功能更加丰富的SOAP消息交互。所以从其实现上来说,改进Web服务能够有效地兼容基本Web服务。

WS-*的协议众多,但其中最为核心的3个内容,分别为WS-SecurityWS-Atomic事务流和WS-ReliableMessaging。这里将简要介绍这个协议的内容。

1WS-Security安全协议

WS-Security的制定目标是使用应用程序构建安全的SOAP消息交换。WS-Security很灵活,它被设计成用来构建多种安全性模型(包括PKIKerberosSSL)的基础。WS-Security 特别为多安全性令牌、多信任域、多签名格式和多加密技术提供支持。

WS-Security通过利用现有标准和规范来实现安全性,这样就不必在WS-Security中定义一个完整的安全性解决方案了。业界已经解决了许多此类问题。例如 KerberosX.509用于身份验证;X.509还使用现有的PKI进行密钥管理;XML加密和XML签名描述了XML消息内容的加密和签名方法;XML标准描述了为签名和加密而准备XML的方法。WS-Security在现有规范中添加了一个框架,用于将这些机制嵌入到SOAP消息中。这是以一种与传输无关的方式完成的。

1)身份验证

从身份验证的内容来说,WS-Security提供了3种方法来实现,分别为:

q      用户名/密码。

q      通过X.509证书的PKI

q      Kerberos

用户名/密码的验证方法如下列消息范例所示。

 

<xs:element name="UsernameToken"> <!--用户名/密码的验证方法-->

    <xs:complexType>

        <xs:sequence>

            <xs:element ref="David"/>

            <xs:element ref="DavidPwd" minOccurs="0"/>

        </xs:sequence>

        <xs:attribute name="Id" type="xs:ID"/>

    </xs:complexType>

</xs:element>

 

2签名

签名后的消息几乎无法被篡改。消息签名不能禁止外部各方查看消息内容。使用签名SOAP消息的接收方可以知道已签名的元素在路由中未发生改变。只要可能,就应当使用XML签名对消息进行签名。XML签名已经处理了许多难以描述的问题。WS-Security只是简单解释了如何使用签名来证明消息没有被更改。在SOAP消息中,签名和所需的额外数据添加了大量额外信息。下面是一个签名的消息示例。

 

<Signature Id="MySignature" xmlns="http://www.w3.org/2000/09/xmldsig#">

  <SignedInfo>

    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-

    c14n-20010315"/>

    <SignatureMethod Algorithm="http://www.w3.org/2000/09/

    xmldsig#dsa-sha1"/>

    <Reference URI="http://www.w3.org/TR/2000/REC-xhtml1-20000126/">

      <Transforms>

        <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-

        20010315"/>

      </Transforms>

      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>

    </Reference>

  </SignedInfo>

  <SignatureValue>MC0CFFrVLtRlk=...</SignatureValue><!--签名-->

  <KeyInfo>

    <KeyValue>

      <DSAKeyValue>

        <p>省略信息</p>

        <Q>省略信息</Q>

        <G>省略信息</G>

        <Y>省略信息</Y>

      </DSAKeyValue>

    </KeyValue>

  </KeyInfo>

</Signature>

 

3)加密

有时,仅仅证明消息发送方的身份和表明消息未经更改仍然不够。如果通过签名的纯文本来发送信用卡号或银行账号,攻击者实际上可以验证没有其他攻击者更改过消息的内容。与处理消息签名一样,WS-Security为此也提供了相应规范,采用了现有标准,并且能够很好地完成加密工作。实际上,它们并入了XML加密。

加密数据时,可以选择使用对称加密或不对称加密。对称加密需要一个共享密钥。也就是说,加密消息与解密消息使用的是同一个密钥。如果同时控制两个端点并且可以信任使用密钥的用户和应用程序,则可以使用对称加密。对称加密在密钥分发上存在一点问题。在某个时间点上,密钥需要发送给接收方。

如果需要使用简单的分布式密钥来发送数据,则可以使用不对称加密。X.509证书允许使用不对称加密。接收数据的端点可以公布它的证书,并允许任何人使用公钥来加密信息。只有接收方知道私钥。因此,只有接收方可以得到加密的数据并将其重新转换为可读内容。

那么,加密后的消息是什么形式呢?如果使用的是Triple-DES,则发送方和接收方都必须以某种安全的方式交换密钥。对称密钥可以隐藏在Kerberos票据内,或被取出交换。

2WS-Atomic事务流

为了在普通的SOAP消息交互中加入事务处理的能力,改进Web服务协议中定义了WS-Atomic事务流协议,该协议建立在WS-Coordination协议之上。WS-Coordination协议定义了激活、注册服务。这里暂且不讨论WS-Coordination协议的细节,有兴趣的读者可以参考W3C的协议文档。

WS-Atomic事务流协议主要定义了两个事务协议,如下所示。

1)完成协议(Completion

完成协议被用来启动提交/回滚流程。基于注册协议的每一个事务参与者,事务协调者会先处理易失两段提交,再处理持久两段提交,其结果最后被发送到事务发起者。

事务协调者接收下列所示的消息。

q      提交(Commit):接收到提交通知时,协调者认为事务参与方已经完成了事务并且准备提交。

q      回滚(Rollback):接收到回滚通知时,协调者认为事务参与方中止了事务并且准备回滚。

而事务发起者接收下列消息。

q      已提交(Committed):当收到已提交通知后,事务发起者认为事务协调者决定提交事务。

q      已中止(Aborted):当收到已中止通知后,事务发起者认为事务协调者决定中止事务。图24.13展示了WS-Atomic完成协议的流程。

24.13  完成协议流程

2)两段提交协议

两段提交协议是特别针对分布式事务提出的,两段提交协议分为两个类型,分别为易失两段提交协议和持久两段提交协议。接收到提交通知后,协调者开始所有注册了易失两段提交协议的参与者的提交准备,所有参与者都必须及时给出回复。在所有易失二段提交协议参与者的提交准备结束后,协调者将开始所有注册了持久两段提交协议的提交准备。

在两段提交协议中,事务参与者接收如下所示的消息。

q      准备(Prepare):当接收到准备通知后,参与者将进入第一阶段并且进行投票,是提交该事务还是中止该事务。如果参与者已经对该事务进行投票,那它必须再次投票并且保证投票结果和上次一致。如果参与者对该事务没有了解,则它必须投中止票。

q      回滚(Rollback):当接收到回滚通知后,参与者将中止并丢弃事务。该消息既可以出现在提交的第一阶段,也可以出现在第二阶段。一旦发出该消息,协调者将丢弃该事务。

q      提交(Commit):当收到提交通知后,参与者将提交事务。该消息必定在第二阶段发出,并且必须在参与者投出提交票之后。如果参与者不了解该事务,必须向协调者发出已提交(Committed)通知。

事务协调者接收下列消息:

q      准备完毕(Prepared):当收到准备完毕通知后,协调者知道参与者已经准备好并投票提交事务。

q      只读(ReadOnly):当收到只读通知后,协调者知道参与者投出了提交票,并且已经丢弃事务。该参与者并不希望参与到两段提交的第二阶段。

q      中止(Aborted):当收到中止通知后,协调者知道参与者已经中止并丢且了事务。

q      已提交(Commited):当收到已提交通知后,协调者知道参与者已经提交事务,这时参与者可以安全地丢弃事务了。

q      重现(Replay):当收到重现通知后,协调者将视参与者刚刚从一个可恢复的错误中恢复。协调者将重新发送上一个协议通知。

24.14展示了WS-Atomic两段提交协议的流程。

24.14  WS-Atomic 两段提交协议流程

3WS-ReliableMessaging协议

WS-ReliableMessaging协议指定的目的是保证消息的可靠传输。这里的可靠传输精确概念定义如下所示。

q      最多一次:如果没有发生任何错误,那一条消息最多只会被发送一次。

q      最少一次:每一条消息必须最少被发送一次。

q      有序:所有的消息必须被有序地发送。

WS-ReliableMessaging的设计和TCP协议非常地类似,这里笔者仅列举一个实际传输示例来简要地介绍WS-ReliableMessaging协议。传输示例如图24.15所示。

24.15  WS-ReliableMessaging 传输示例

在图24.15的示例中,节点1和节点2的消息传输经历了下述过程。

q      协议预处理,策略交换,节点信息交互,连接建立。

q      可靠消息源发出建立可靠消息传输请求。

q      可靠消息目的地建立消息传输,并返回一个GUID

q      可靠消息源开始依次发送消息,从1号到3号。

q      3号消息发送时,发送端包含了<LastMessage>以通知发送完毕。

q      由于可靠消息发送目的地没有收到2号消息,所以只发送1号和3号消息的ACK

q      可靠消息发送源重新发送2号消息,并且指定要求ACK

q      可靠消息目的地收到2号消息并发送123号消息的ACK

q      可靠消息源收到ACK,并且发送关闭可靠消息传输的命令。

q      可靠消息目的地关闭可靠消息传输。

24.6.3  使用wsHttpBinding

WCF对改进的Web服务提供了全面的支持,就绑定来说,包括wsHttpBinding在内的多个标准绑定都支持改进的Web服务。wsHttpBinding提供了和其他技术平台进行交互的能力,而其使用的通信协议正是改进的SOAP协议以及一系列WS-*协议。表24.7列出了wsHttpBinding所支持的WS-*协议。

%说明:和以.net为前缀的绑定一样,以ws为前缀的绑定也具有共性。那就是它们都通过和Web服务相关的通信协议进行交互,并且由于Web服务的跨平台性。这些绑定都可以和非.NET平台交互。

24.7  wsHttpBinding支持的改进Web服务协议

<DIV align=center>

   

   

SOAP1.2

简单对象访问协议1.2版本

WS-Addressing 2005/08

为以同步和/或异步方式传输的SOAP消息提供了一种统一的寻址方法

WSS Message Security 1.0

支持使用诸如PKIKerberosSSL等机制保证Web服务安全性

WSS Message Security UsernameToken Profile1.1

支持使用用户名/密码机制保证安全

WSS SOAP Message Security X509 Token Profile1.1

支持使用X.509证书

WS-SecureConversation

安全策略断言

WS-ReliableMessage

可靠消息传输

WS-Coordination

协调分布式系统动作的协议

WS-Atomic Transactions

分布式事务协议

WS-Addressing

为以同步和/或异步方式传输的SOAP消息提供了一种统一的寻址方法

</DIV>

 

wsHttpBinding的可配置属性如表24.8所示。

24.8  wsHttpBinding的属性

<DIV align=center>

   

   

   

bypassProxyOnLocal

在访问本地终节点时绕过代理

false

closeTimeout

等待连接的超时时间

00:01:00

hostNameComparisonMode

指定将传入的消息调度到服务终节点时应该如何在URI比较中使用主机名

StrongWildCard

maxBufferPoolSize

内存中用于对传入消息进行缓冲的最大字节数

524888

maxReceivedMessageSize

定义在采用此绑定配置的通道上可以接收的消息的最大消息大小(字节),包括消息标头。如果消息对于接收方而言太大,则发送方将收到 SOAP 错误。接收方将删除该消息,并在跟踪日志中创建事件项

65536

messageEncoding

定义用于对SOAP消息进行编码的编码器,可选项包括TextMtom

Text

name

绑定的名字

 

openTimeout

在传输引发异常之前可用于打开连接的时间间隔

00:01:00

proxyAddress

代理地址

N/A

readerQuotas

可由使用此绑定配置的终节点处理的SOAP消息的复杂性约束

N/A

receiveTimeout

在传输引发异常之前可用于完成读取操作的时间间隔

00:01:00

reliableSession

获取一个对象,当使用系统提供的一个绑定时,该对象可提供对可用的可靠会话绑定元素属性的便捷访问

false

security

指定与采用此绑定配置的服务一起使用的安全类型

N/A

sendTimeout

指定为完成发送操作提供的时间间隔。

00:01:00

textEncoding

设置要用来在绑定上发出消息的字符集编码,可选项包括BigEndianUnicodeUnicodeUTF8

utf-8

transactionFlow

指示此绑定是否应支持流动WS-Transactions

false

userDefaultWebProxy

指定是否应在可用时使用系统的自动配置HTTP代理

true

</DIV>

 

24.6.4  wsHttpBinding的地址和配置

改进的Web服务仍然基于HTTP/HTTPS协议进行消息交互,所以和basicHttpBinding一样,wsHttpBinding使用HTTP/HTTPS作为地址协议部分。其具体模式如下所示。

 

http://[Hostname]:[Port]/[ServiceAddress]

https://[Hostname]:[Port]/[ServiceAddress]

 

示例代码24-15展示了如何在服务端配置wsHttpBinding

示例代码24-15

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.web>

    <compilation debug="true" /><!--允许debug-->

  </system.web>

  <system.serviceModel>

    <services>

      <service name="HelloWorldService.Service">

        <host>

          <baseAddresses>

           <!--基地址-->

            <add baseAddress="http://ProfessionalWCFServer:80/"></add>

          </baseAddresses>

        </host>

        <!--使用wsHttpBinding-->

        <endpoint address ="HelloWorldService" <!--地址-->

                  binding="wsHttpBinding"<!--绑定-->

                  bindingConfiguration="myBinding"<!--绑定设置名-->

                  contract="HelloWorldService.IService"><!--契约-->

        </endpoint>

      </service>

    </services>

    <bindings>

      <!--设置wsHttpBinding的属性-->

      <wsHttpBinding>

        <binding name="myBinding"<!--设置name属性-->

            closeTimeout="00:00:10"<!--设置closeTimeout属性-->

            openTimeout="00:00:20"<!--设置openTimeout属性-->

            receiveTimeout="00:00:30"<!--设置receiveTimeout属性-->

            sendTimeout="00:00:40"<!--设置sendTimeout属性-->

            bypassProxyOnLocal="false"<!--设置bypassProxyOnLocal属性-->

            transactionFlow="false"<!--设置transactionFlow属性-->

            hostNameComparisonMode="WeakWildcard"<!--设置

            hostNameComparisonMode属性-->

            maxMessageSize="1000"<!--设置maxMessageSize属性-->

            messageEncoding="Mtom"<!--设置messageEncoding属性-->

            proxyAddress="http://ProfessionalWCF/proxy"<!--设置

            proxyAddress属性-->

            textEncoding="utf-16"<!--设置textEncoding属性-->

            useDefaultWebProxy="false"><!--设置useDefaultWebProxy属性-->

          <reliableSession ordered="false"<!--设置可靠会话-->

               inactivityTimeout="00:02:00"

               enabled="true" />

          <security mode="Transport"><!--安全设置-->

            <transport clientCredentialType="Digest"

               proxyCredentialType="None"

               realm="someRealm" />

            <message clientCredentialType="Windows"

               negotiateServiceCredential="false"

               algorithmSuite="Aes128"

               defaultProtectionLevel="None" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

  </system.serviceModel>

</configuration>

 

示例代码24-16展示了如何在客户端配置wsHttpBinding

示例代码24-16

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.web>

    <compilation debug="true" /><!--允许debug-->

  </system.web>

  <system.serviceModel>

    <client>

        <!--使用basicHttpBinding-->

        <endpoint address ="http://ProfessionalWCFServer:80/

        HelloWorldService" <!--地址-->

                  binding="wsHttpBinding"<!--绑定-->

                  bindingConfiguration="myBinding"<!--绑定设置名-->

                  contract="HelloWorldService.IService"><!--契约-->

        </endpoint>

    </client>

    <bindings>

      <!--设置wsHttpBinding的属性-->

      <wsHttpBinding>

        <binding name="myBinding"<!--设置name属性-->

            closeTimeout="00:00:10"<!--设置closeTimeout属性-->

            openTimeout="00:00:20"<!--设置openTimeout属性-->

            receiveTimeout="00:00:30"<!--设置receiveTimeout属性-->

            sendTimeout="00:00:40"<!--设置sendTimeout属性-->

            bypassProxyOnLocal="false"<!--设置bypassProxyOnLocal属性-->

            transactionFlow="false"<!--设置transactionFlow属性-->

            hostNameComparisonMode="WeakWildcard"<!--设置

            hostNameComparisonMode属性-->

            maxMessageSize="1000"<!--设置maxMessageSize属性-->

            messageEncoding="Mtom"<!--设置messageEncoding属性-->

            proxyAddress="http://ProfessionalWCF/proxy"<!--设置

            proxyAddress属性-->

            textEncoding="utf-16"<!--设置textEncoding属性-->

            useDefaultWebProxy="false"><!--设置useDefaultWebProxy属性-->

          <reliableSession ordered="false"<!--设置可靠会话-->

               inactivityTimeout="00:02:00"

               enabled="true" />

          <security mode="Transport"><!--安全设置-->

            <transport clientCredentialType="Digest"

               proxyCredentialType="None"

               realm="someRealm" />

            <message clientCredentialType="Windows"

               negotiateServiceCredential="false"

               algorithmSuite="Aes128"

               defaultProtectionLevel="None" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

  </system.serviceModel>

</configuration>

24.6.5  wsHttpBinding特点总结

WCF提供了如下所示的多个支持改进Web服务的绑定,wsHttpBasic是其中较为常用的一个,其比较显著的一个特点在于不支持双工模式,这也是它和wsDualHttpBinding最大的区别。

q      支持单程传输模式。

q      支持请求-响应传输模式。

q      不支持双工传输模式。

q      性能在标准绑定中一般。

q      支持WS-事务协议。

q      支持传输层消息安全。

q      提供与改进Web服务的交互性。

q      支持跨主机交互。

q      支持可靠会话传输。

24.6.6  使用wsDualHttpBinding

使用wsHttpBinding基本能够满足和改进Web服务系统进行交互的需求,但wsHttpBinding却不支持双工传输模式。如果希望支持和改进Web服务系统进行双工交互,就需要选择wsDualHttpBindingwsDualHttpBinding支持双工传输模式,但却不支持传输层的消息安全。除了这两点外,wsDualHttpBindingwsHttpBinding完全一致。表24.9列出了wsDualHttpBinding的属性。

24.9  wsDualHttpBinding的属性

<DIV align=center>

   

   

   

bypassProxyOnLocal

在访问本地终节点时绕过代理

false

closeTimeout

等待连接的超时时间

00:01:00

hostNameComparisonMode

指定将传入的消息调度到服务终节点时应该如何在URI比较中使用主机名

StrongWildCard

maxBufferPoolSize

内存中用于对传入消息进行缓冲的最大字节数

524888

maxReceivedMessageSize

定义在采用此绑定配置的通道上可以接收的消息的最大消息大小(字节),包括消息标头。如果消息对于接收方而言太大,则发送方将收到 SOAP 错误。接收方将删除该消息,并在跟踪日志中创建事件项

65536

messageEncoding

定义用于对SOAP消息进行编码的编码器,可选项包括TextMtom

Text

name

绑定的名字

 

openTimeout

在传输引发异常之前可用于打开连接的时间间隔

00:01:00

proxyAddress

代理地址

N/A

readerQuotas

可由使用此绑定配置的终节点处理的SOAP消息的复杂性约束

N/A

receiveTimeout

在传输引发异常之前可用于完成读取操作的时间间隔

00:01:00

reliableSession

获取一个对象,当使用系统提供的一个绑定时,该对象可提供对可用的可靠会话绑定元素属性的便捷访问

false

security

指定与采用此绑定配置的服务一起使用的安全类型

N/A

sendTimeout

指定为完成发送操作提供的时间间隔

00:01:00

textEncoding

设置要用来在绑定上发出消息的字符集编码,可选项包括:BigEndianUnicodeUnicodeUTF8

utf-8

transactionFlow

指示此绑定是否应支持流动WS-Transactions

false

userDefaultWebProxy

指定是否应在可用时使用系统的自动配置HTTP代理

true

</DIV>

24.6.7  wsDualHttpBinding的地址和配置

wsDualHttpBinding的地址形式和wsHttpBinding完全一致,这里不再重复列出。示例代码24-17展示了如何在服务端配置wsDualHttpBinding

%说明:HelloWorld系统并没有双工的功能,但这里的配置却进行了双工配置。置于双工的协议设置和使用场合,将在本书的后续章节中详细介绍,本章只研究绑定、通道的配置。

示例代码24-17

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.web>

    <compilation debug="true" /><!--允许debug-->

  </system.web>

  <system.serviceModel>

    <services>

      <service name="HelloWorldService.Service">

        <host>

          <baseAddresses>

           <!--基地址-->

            <add baseAddress="http://ProfessionalWCFServer:80/"></add>

          </baseAddresses>

        </host>

        <!--使用wsDualHttpBinding-->

        <endpoint address ="HelloWorldService" <!--地址-->

                  binding="wsDualHttpBinding" <!--绑定-->

                  bindingConfiguration="myBinding"<!--绑定设置名-->

                  contract="HelloWorldService.IService"><!--契约-->

        </endpoint>

      </service>

    </services>

    <bindings>

      <!--设置wsDualHttpBinding的属性-->

      <wsDualHttpBinding>

        <binding name="myBinding"<!--设置name属性-->

            closeTimeout="00:00:10"<!--设置closeTimeout属性-->

            openTimeout="00:00:20"<!--设置openTimeout属性-->

            receiveTimeout="00:00:30"<!--设置receiveTimeout属性-->

            sendTimeout="00:00:40"<!--设置sendTimeout属性-->

            bypassProxyOnLocal="false"<!--设置bypassProxyOnLocal属性-->

            transactionFlow="true"<!--设置transactionFlow属性-->

            hostNameComparisonMode="WeakWildcard"<!--设置

            hostNameComparisonMode属性-->

            maxReceivedMessageSize="1000"<!--设置maxReceivedMessageSize

            属性-->

            messageEncoding="Mtom"<!--设置messageEncoding属性-->

            proxyAddress="http://ProfessionalWCF/proxy"<!--设置

            proxyAddress属性-->

            textEncoding="utf-16"<!--设置textEncoding属性-->

            useDefaultWebProxy="false"><!--设置useDefaultWebProxy属性-->

          <reliableSession ordered="false"<!--设置可靠会话-->

              inactivityTimeout="00:02:00" />

          <security mode="None"><!--安全设置-->

            <message clientCredentialType="None"

                negotiateServiceCredential="false"

                algorithmSuite="Aes128" />

          </security>

        </binding>

      </wsDualHttpBinding>

    </bindings>

  </system.serviceModel>

</configuration>

 

示例代码24-18展示了如何在客户端配置wsDualHttpBinding读者需要注意由于是双工模式交互这里的客户端配置和本章前面介绍的客户端绑定略有不同需要在绑定配置中指定客户端的基地址。

示例代码24-18

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.web>

    <compilation debug="true" /><!--允许debug-->

  </system.web>

  <system.serviceModel>

    <client>

        <!--使用basicHttpBinding-->

        <endpoint address ="http://ProfessionalWCFServer:80/

        HelloWorldService" <!--地址-->

                  binding="wsDualHttpBinding"<!--绑定-->

                  bindingConfiguration="myBinding"<!--绑定设置名-->

                  contract="HelloWorldService.IService"><!--契约-->

        </endpoint>

    </client>

    <bindings>

      <!--设置wsDualHttpBinding的属性-->

      <wsDualHttpBinding>

        <binding name="myBinding"<!--设置name属性-->

            closeTimeout="00:00:10"<!--设置closeTimeout属性-->

            openTimeout="00:00:20"<!--设置openTimeout属性-->

            receiveTimeout="00:00:30"<!--设置receiveTimeout属性-->

            sendTimeout="00:00:40"<!--设置sendTimeout属性-->

            bypassProxyOnLocal="false"<!--设置bypassProxyOnLocal属性-->

            transactionFlow="true"<!--设置transactionFlow属性-->

            hostNameComparisonMode="WeakWildcard"<!--设置

            hostNameComparisonMode属性-->

            maxReceivedMessageSize="1000"<!--设置maxReceivedMessageSize

            属性-->

            messageEncoding="Mtom"<!--设置messageEncoding属性-->

            proxyAddress="http://ProfessionalWCF/proxy"<!--设置

            proxyAddress属性-->

            textEncoding="utf-16"<!--设置textEncoding属性-->

            useDefaultWebProxy="false"><!--设置useDefaultWebProxy属性-->

          <reliableSession ordered="false"<!--设置可靠会话-->

              inactivityTimeout="00:02:00" />

          <security mode="None"><!--安全设置-->

            <message clientCredentialType="None"

                negotiateServiceCredential="false"

                algorithmSuite="Aes128" />

          </security>

        </binding>

      </wsDualHttpBinding>

    </bindings>

  </system.serviceModel>

</configuration>

24.6.8  wsDualHttpBinding特点总结

正如笔者在前文中所述wsDualHttpBindingwsHttpBinding的区别在于两方面前者支持双工模式而后者支持传输层的消息安全。wsDualHttpBinding的特点总结如下

q      支持单程传输模式。

q      支持请求-响应传输模式。

q      支持双工传输模式。

q      性能在标准绑定中一般。

q      支持WS-事务协议。

q      不支持传输层消息安全。

q      提供与改进Web服务的交互性。

q      支持跨主机交互。

q      支持可靠会话传输。

24.6.9  使用ws2007HttpBinding

.NET Framework 3.5版本推出了wsHttpBinding的更新版本ws2007HttpBindingws2007HttpBinding继承自wsHttpBinding,与旧版本相比,ws2007HttpBinding支持最新的WS-*协议。表24.10列出了ws2007HttpBinding所支持的最新的WS-*协议。

24.10  ws2007HttpBinding所支持的WS-*协议

<DIV align=center>

   

   

WS-SecureConversation v1.3

WS-Security的扩展,为多消息交互提供安全上下文

WS-Trust v1.3

WS-Security的扩展,用于管理信任连接

WS-SecurityPolicy v1.2

安全策略断言 v1.2

WS-ReliableMessage v1.1

可靠消息传输 v1.1

WS-Atomic Transactions v1.1

分布式事务协议 v1.1

WS Services Coordination v1.1

协调分布式系统动作协议 v1.1

</DIV>

%说明:除了支持的WS-*协议不同之外,ws2007HttpBinding的可配置属性、配置方法、地址形式、绑定的特点都和wsHttpBinding完全一致。笔者这里不再重复介绍。

 
 
  上一页 返回 下一页  
 
Copyright © 2010 TianMei Technology All rights reserved. To comment on this site
  辽B-2-4-20100065