WCF 第二章 契约 同步请求回复操作
2011-06-23 20:51 DanielWise 阅读(1396) 评论(0) 编辑 收藏 举报对服务操作来说,同步请求回复消息交换是最普通的模式。这个模式就像任何人在面向过程或者面向对象语言中编程的那样。请求回复模式是本地过程调用的原型,对远程过程调用也很普通。图片2.3显示了一个请求回复交互,一个在客户端运行的代理发送请求给一个服务,服务端同步返回消息给客户端。

WCF使得在客户端和服务端进行请求-回复通信非常容易。在设计阶段,你使用添加服务引用或者svcutil.exe来调用服务元数据终结点而且生成一个客户端代理来模仿服务操作的签名。这允许客户端代码像本地函数调用一样调用代理上的方法。代理把方法名字和参数序列化成一个SOAP消息,然后发送SOAP消息到服务端,然后创建一个.NET类型来表示从服务返回的回复消息。
列表2.1显示一个服务契约定义。一个服务契约和一个操作契约被定义到代码中。操作契约代表一个可以被客户端调用的方法,或者更准确一些的说,一条消息可以被客户端发送并被服务端理解。注意契约在接口中定义,而不是类定义。
using System; using System.ServiceModel; namespace EssentialWCF { [ServiceContract] public interface IStockService { [OperationContract] double GetPrice( string ticker); } public class StockService : IStockService { public double GetPrice( string ticker) { return 94.85; } } } |
列表2.2显示了客户端代码,使用一个由添加服务引用生成的代理并调用列表2.1中的服务。这很像列表1.2中显示的代码。
using System; using System.ServiceModel; namespace Client { class Client { static void Main( string [] args) { localhost.StockServiceClient proxy = new localhost.StockServiceClient(); double price = proxy.GetPrice( "msft" ); Console.WriteLine( "msft:{0}" , price); proxy.Close(); } } } |
列表2.3 显示了从客户端发送到服务终结点的SOAP消息。有很多值得注意的地方:
SOAP消息的命名空间是http://tempuri.org/,除非在[ServiceContract]中重载属性否则这就是默认的。如果服务将要暴露在一个应用的外面或者在一个相对小的组织外面,你应该重载默认属性,因为命名空间结构设计来唯一定义你的服务来避免多个连接服务模棱两可。
SOAP消息的命名空间是http://tempuri.org/,除非在[ServiceContract]中重载属性否则这就是默认的。如果服务将要暴露在一个应用的外面或者在一个相对小的组织外面,你应该重载默认属性,因为命名空间结构设计来唯一定义你的服务来避免多个连接服务模棱两可。
在列表1.1中类的定义中的方法名,GetPrice用来定义wsa:动作在SOAP消息头中。完全的动作名是契约命名空间的组合,契约名字(接口名字或者类型,如果没有明确的服务接口被使用)操作名字,一个额外的字符串(如果消息是一个相关的回复)。
SOAP消息体由方法签名控制,具体方法由[OperationContract]和[DataContract]属性确定。SOAP消息头包括消息将要发送到的地址。这种情况下,它是寄宿在IIS服务器上的SVC文件。
< s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> < s:Header > < To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"> </ To > < Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"> http://tempuri.org/StockService/GetPrice </ Action > </ s:Header > < s:Body > < GetPrice xmlns="http://tempuri.org/"> < ticker >msft</ ticker > </ GetPrice > </ s:Body > </ s:Envelope > |
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述