WCF中几个基本知识点整理
1、WCF中的Message
{
Created,
Read,
Written,
Copied,
Closed
}
对Message对象,只有在Create状态下,才能读,否则读取会有异常。Message
同样定义了许多Write之类的方法,这些Write方法同样也只能用于处于Created的消息。
在WCF中,有可能需要对消息进行一些读取、等操作。但是读取操作会改变Message的
状态,导致再次读取会有异 常。这时,可以使用Message定义的CreateBufferedCopy方法。
它的签名如下:
它返回的是MessageBuffer对象,它能进行多次Create而返回Message对象,并且Message的状态为Created。
大数据量二进制数据以SOAP传输时优化使用的格式,也与平台无关;Binary是以二进制格式编码,
只用于.Net平台上。
服务可以根据他发布自己的元数据。
是自动发布服务的元数据信息,于是我们可以通过WSDL工具生成WebService的代理类。
但是我们可以通过发布元数据交换终结点,生成服务的代理。
WCF自动为服务宿主自动提供了IMetadataExchange接口的实现。对于元数据交换终结点,
WCF提供了专门的绑定元素用以对不同的协议(如:HTTP、TCP、IPC)的支持。如HTTP则对应
mexHttpBinding;对于Tcp则对应mexTcpBinding;对于IPC则对应mexNamedPipeBinding。
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.CalculatorService" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:3636/mexTcp" />
<add baseAddress="http://127.0.0.1:6363/mexHttp"/>
<add baseAddress="net.pipe://127.0.0.1"/>
</baseAddresses>
</host>
<endpoint address="net.tcp://localhost:3636/SessionfulCalculator" binding="netTcpBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="http://localhost:6363/SessionfulCalculator" binding="wsHttpBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="netpipe" binding="netNamedPipeBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"> </endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"> </endpoint>
<endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange"> </endpoint>
</service>
</services>
</system.serviceModel>
这样,不管服务所支持的HTTP、TCP、IPC等方式,我们都可以通过SVCUtil工具生成代理类
进而访问服务。
在WCF中,对于HTTP协议而言,我们可以通过直接配置服务的行为,通过httpGetEnabled="true"
的方式来发布服务的元数据信息,而它不支持其他协议;对于其他协议我们希望发布元数据信息,
通过配置的方式显然是一种很好的方式。
contract="IMetadataExchange"></endpoint>
如果address配置为空或者与behavior中 name配置相同,则可以直接通过SVCUtil加上
baseAddress生成代理类。如下图:
如果address和behavior中 name配置不同则生成代理类时SVCUtil 需要加上baseAddress +
<endpointaddress="mex" binding="mexNamedPipeBinding"contract="IMetadataExchange" />
中的address的属性值。如下图 :
<serviceMetadata httpGetEnabled="false"/>
</behavior>