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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构