灵活地传输类型化的应用程序数据的制作方法

文档序号:7627097阅读:140来源:国知局
专利名称:灵活地传输类型化的应用程序数据的制作方法
技术领域
本发明涉及电子消息通信,尤其涉及灵活地传输类型化的应用程序数据。
背景技术
计算机系统和相关技术影响着社会的许多方面。实际上,计算机系统处理信息的能力转换了人们生活和工作的方式。计算机系统现在通常执行在计算机系统出现之前手动执行的许多任务(例如,文字处理、日程安排和数据库管理)。最近,计算机系统被彼此耦合以及耦合到其它电子设备以形成有线和无线的计算机网络,通过该计算机网络,计算机系统和其它电子设备能够传输电子数据。结果,在计算机系统上执行的许多任务(例如,语音通信、访问电子邮件、控制家用电器、web浏览以及打印文档)包括多个计算机系统和/或其它电子设备之间经由有线和/或无线计算机网络的电子消息交换。
网络实际上已变得如此大量增长,使得简单的启用网络的计算系统可通过通常被称为“因特网”的网络集合体与遍及全球的上百万个其它计算系统中的任何一个进行通信。这样的计算系统可包括台式机、膝上型计算机或图形输入板个人计算机;个人数字助理(PDA);电话机;或能够通过数字网络进行通信的任何其它计算机或设备。
为通过网络通信,一个计算系统(被称为“发送计算系统”)构造或访问电子消息,并通过网络将该电子消息发送到另一计算系统(在此被称为“接收计算系统”)。当电子消息是电子邮件或即时消息时,电子消息可由人类用户阅读,或者可替代地由运行在接收计算系统上的应用程序读取。电子消息可由运行在发送计算系统上的应用程序在人类用户的可能协助下构造。
由此,在某些环境中,消息是用极少(如果有的话)的直接用户交互在分布式应用程序之间交换的。用于在分布式应用程序(例如,web服务)之间交换消息的一种协议是简单对象访问协议(“SOAP”)。SOAP是预期用于在分散的、分布式的环境中交换信息的轻量级协议。SOAP使用可扩展标记语言(“XML”)技术来定义可扩展消息通信框架,该框架提供了可通过诸如简单邮件传输协议(“SMTP”)、超文本传输协议(“HTTP”)、用户数据报协议(“UDP”)、传输控制协议(“TCP”)和命名管道等各种底层协议来交换的消息构造。SOAP消息可在开放的意义上被定义为具有一组消息头部和消息主体的SOAP信息集(infoset)(例如,XML元素)。
许多应用程序是使用方法和/或面向对象的编程模型来设计的。这些编程模型通常使用类型数据格式(例如,整数、串、逻辑或用户定义的数据格式)以在模块之间交换对象。例如,方法可接收一个或多个类型化的对象(例如,各种不同数据类型格式的参数)作为输入。作为响应,方法可生成并输出该类型化的对象的(可能不同的)值,或者可返回不同的数据类型(例如,该方法的数据类型)的类型化的对象。对类型化的数据格式的使用是有利的,因为它允许开发者基于应用程序和/或模块功能使用更适当和/或更有效的数据类型来设计应用程序和模块。
由此,在分布式应用程序环境中,类型化的对象可以在分布式应用程序的不同部分之间交换。例如,为便于银行交易,分布式银行客户机可与分布式银行服务器交换类型化的银行交易数据结构。然而,可能很难设计同时利用类型化的数据格式的优点以及SOAP消息的灵活性的分布式应用程序。
SOAP是一种开放的协议,并由此实际上没有对应用程序和/或用户数据对SOAP消息的映射和相反方向的映射施加任何要求。由此,只有有限的机制(如果有的话)用于将类型化的对象(例如,公共语言运行时环境(“CLR”)类型)映射到对应的SOAP消息以及用于将SOAP消息映射到对应的类型化的对象。不能在类型化的对象和SOAP消息之间进行有意义的映射使得分布式应用程序更难或甚至不可能交换应用程序和/或用户数据。
此外,用于将SOAP消息编码成原始八比特组的典型机制限制了SOAP消息的大小,并限制了可使用的编码器的类型。因此,用于灵活地传输类型化的应用程序数据的系统、方法和计算机程序产品将是有利的。

发明内容
本发明的原理克服了现有技术的上述问题,本发明针对用于灵活地传输类型化的应用程序数据的方法、系统和计算机程序产品。在某些实施例中,一种计算机系统配置SOAP消息以发送类型化的数据。应用程序代码(例如,客户机代理)用类型化的对象参数(例如,方法调用的参数)来调用类型化的对象(例如,方法)。该计算机系统访问对应于类型化的对象的类型化对象参数。类型化对象是用消息协定模型的一个或多个消息协定属性来注释的。一个或多个消息协定属性定义了类型化的对象参数和对应的SOAP元素之间的映射。
该计算机系统依照一个或多个消息协定属性将所访问的类型化的对象参数映射到SOAP元素。计算机系统参考一个或多个消息协定属性来标识SOAP信封内的位置(例如,消息头部或消息主体)。该计算机系统将SOAP元素插入到SOAP信封内所标识的位置中。SOAP信封然后可被放置在通道内、被编码成对应的原始八比特组、并且对应的原始八比特组被传输到另一计算机系统。
在其它实施例中,一种计算机系统从SOAP消息中检索类型化的数据。该计算机系统可从另一计算机系统接收原始的八比特组、将原始的八比特组解码成对应的SOAP信封、并将SOAP信封放置在通道中。该计算机系统访问包括在SOAP信封中的SOAP元素。
该计算机系统标识对应于SOAP元素的类型化的对象。该类型化的对象是用消息协定模型的一个或多个消息协定属性来注释的。一个或多个消息协定属性定义了SOAP元素和对应的类型化对象参数之间的映射。该计算机系统依照一个或多个消息协定属性将所访问的SOAP元素映射到类型化的对象参数。类型化的对象参数被提交给包括所标识的类型化对象的应用程序代码(例如,服务)。
本发明的这些和其它目的和特征将从以下描述和所附权利要求书中变得完全清楚,或者可通过对如后文所述的对本发明的实践中获知。


为进一步阐明本发明的上述以及其它优点和特征,将参考附图中所示出的其特定实施例来呈现对本发明的更具体描述。可以理解,这些附图仅描述了本发明的典型实施例,并且因此不被认为是限制其范围。本发明将通过使用附图用附加的特殊性和细节来描述和解释,附图中图1示出了便于对交换的类型化对象使用简单对象访问协议的计算机体系结构的示例。
图2示出了灵活地发送类型化的应用程序数据的方法的示例流程图。
图3示出了灵活地接收类型化的应用程序数据的方法的示例流程图。
图4示出了适用于本发明的原理的操作环境。
具体实施例方式
本发明的原理克服了现有技术的上述问题,本发明针对用于灵活地传输类型化的应用程序数据的方法、系统和计算机程序产品。在某些实施例中,一种计算机系统配置SOAP消息以发送类型化的数据。应用程序代码(例如,客户机代理)用类型化的对象参数(例如,方法调用的参数)来调用类型化的对象(例如,方法)。该计算机系统访问对应于该类型化的对象的类型化的对象参数。该类型化的对象是用消息协定模型的一个或多个消息协定属性来注释的。该一个或多个消息协定属性定义了类型化的对象参数和对应的SOAP元素之间的映射。
该计算机系统依照一个或多个消息协定属性将所访问的类型化的对象参数映射到SOAP元素。该计算机系统参考一个或多个消息协定属性来标识SOAP信封内的位置(例如,消息头部或消息主体)。计算机系统将SOAP元素插入到SOAP信封内所标识的位置中。SOAP信封然后可被放置在通道中、被编码成对应的原始八比特组、并且对应的原始八比特组被传输到另一计算机系统。
在其它实施例中,计算机系统从SOAP消息中检索类型化的数据。计算机系统可从另一计算机系统中检索原始八比特组、将该原始八比特组解码成对应的SOAP信封、并将SOAP信封放置在通道中。计算机系统访问包括在SOAP信封中的SOAP元素。
该计算机系统标识对应于SOAP元素的类型化的对象。该类型化的对象是用消息协定模型的一个或多个消息协定属性来注释的。一个或多个消息协定属性定义了SOAP元素和对应的类型化对象参数之间的映射。该计算机系统依照一个或多个消息协定属性将所访问的SOAP元素映射到类型化的对象参数。类型化的对象参数被提交给包括所标识的类型化对象的应用程序代码(例如,服务)。
本发明范围内的实施例包括用于承载或在其上储存计算机可执行指令或数据结构的计算机可读介质。这一计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。作为示例而非局限,这类计算机可读介质可包括物理存储介质,诸如RAM、ROM、EPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或可用于以计算机可执行指令、计算机可读指令或数据结构的形式承载或储存所需的程序代码装置并可由通用或专用计算机系统访问的任何其它介质。
在本说明书以及所附权利要求书中,“网络”被定义为启用计算机系统和/或模块之间的电子数据的传输的一个或多个数据链路。当信息通过网络或另一通信连接(硬布线、无线或硬布线和无线的组合)被传输或提供给计算机系统时,该连接被适当地视为计算机可读介质。由此,任何这样的连接可被适当地称为计算机可读介质。上述的组合也应当被包括在计算机可读介质的范围之内。计算机可执行指令包括,例如使通用计算机系统或专用计算机系统执行一个或一组特定功能的指令和数据。计算机可执行指令可以是,例如二进制代码、诸如汇编语言等中间格式指令,或甚至是源代码。
在本说明书及所附权利要求书中,“计算机系统”被定义为一个或多个软件模块、一个或多个硬件模块或其组合,它们共同工作以对电子数据执行操作。例如,计算机系统的定义包括个人计算机的硬件组件,以及诸如个人计算机的操作系统等软件模块。模块的物理布局不是重要的。计算机系统可包括通过网络耦合的一个或多个计算机。同样,计算机系统可包括单个物理设备(诸如移动电话或个人数字助理“PDA”),其中内部模块(诸如存储器和处理器)共同工作以对电子数据执行操作。
在本说明书以及所附权利要求书中,“对象”被定义为可个别地选择和操纵的任何项。对象被定义成包括诸如方法等软件对象,以及包括数据和操纵数据的过程的其它软件对象。对象也被定义成包括可在软件对象之间交换(例如,作为输入或输出提供)的参数和返回值(例如,方法参数和方法返回值)。
在本说明书以及所附权利要求书中,“消息协定”被定义为诸如声明性编程模型等描述简单对象访问协议(“SOAP”)格式的协定。消息协定可以基于定义SOAP信封的动作、头部和主体部分的公共语言运行时(“CLR”)属性。属性可用于类型以控制从例如方法、方法参数和方法返回值构造SOAP信封的方式。要包括在消息协定中的字段和/或特性可用例如[MessageHeader]或[MessageBody]来注释。
本领域的技术人员可以理解,本发明可以在具有多种类型的计算机系统配置的网络计算环境中实施,这些计算机系统配置包括个人计算机、膝上型计算机、手持式设备、多处理器系统、基于微处理器或可编程消费者电子产品、网络PC、小型机、大型计算机、移动电话、PDA、寻呼机等等。本发明也可在分布式系统环境中实施,其中通过网络连接(通过硬布线数据链路、无线数据链路或通过硬布线和无线数据链路的组合)的本地和远程计算机系统都执行任务。在分布式计算系统中,程序模块可以位于本地和远程存储器存储设备中。
如计算机体系结构100中所描述的,计算机系统101和111连接到网络161。网络161可以是局域网(“LAN”)、广域网(“WAN”)或甚至是因特网。连接到网络161的计算机系统可从连接到网络161的其它计算机系统接收数据或向其发送数据。因此,计算机系统101和111以及其它连接的计算机系统(未示出)可创建消息相关数据并通过网络101交换消息相关数据(例如,网际协议(“IP”)数据报和其它使用IP数据报的更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。例如,计算机系统101和111可创建SOAP信封并通过网络161交换SOAP信封。
计算机系统101包括应用程序代码102、类型转换器103、通道106、编码器107和存储163。应用程序代码102可以是分布式应用程序的一部分,诸如对应于应用程序代码112的客户机代理。应用程序代码102可以是依照方法或面向对象的编程模型开发的代码。由此,在应用程序代码102的模块之间、应用程序代码102的模块和应用程序代码112的模块之间、以及应用程序代码102的模块和其它应用程序代码(例如,分布式应用程序的不同部分)之间交换的数据可以是类型化的数据,诸如逻辑、布尔、二进制、八进制、十进制、十六进制、整数、浮点、字符、字符串、用户定义数据类型以及用于定义数据结构的这些数据类型的组合。
类型转换器103被配置成将对应于例如方法调用参数等类型化对象的类型化的数据转换(或序列化)成对应的SOAP元素,以及将SOAP元素转换(或反序列化)成对应于类型化对象的对应的类型数据。例如包括在应用程序代码120中的方法等(例如,类的)类型化对象可用诸如消息协定模型191等消息协定模型的一个或多个消息协定属性(例如,公共语言运行时环境(“CLR”)属性)来注释。类型转换器103可处理消息协定属性,以将类型化对象的类型化数据映射到对应的SOAP元素,例如,映射到可扩展标记语言(“XML”)指令。在某些实施例中,类型转换器103是被配置成依照消息协定模型将CLR方法的参数转换成一个或多个SOAP元素以及将SOAP元素转换成CLR方法的参数的运行时组件。因此,类型转换器103可利用消息协定模型191将类型化的CLR对象转换成SOAP元素的CLR表示,以及将SOAP元素的CLR表示转换成类型化的CLR对象。
通道106提供了用于发送和接收SOAP信封的I/O抽象。通道106可提供用于使用各种传输协议方案(包括HTTP、TCP和用户数据报协议(“UDP”))、接口方案以及寻址方案中的任一种的抽象。一般而言,通道也可被称为连接。
编码器107包括用于将SOAP元素编码成原始的八比特组以及用于将原始的八比特组解码成SOAP元素的一个或多个编码器。由此,尽管编码器107被称为编码器,然而编码器107也可被配置成解码。在计算机体系结构100中,编码器107可包括编码器127、128和129。编码器127、128和129的每一个可不同地被配置成编码/解码。例如,编码器127可被配置成支持通过文本XML的SOAP,编码器128可被配置成通过二进制XML的SOAP,而编码器129可被配置成支持消息传输优化机制(MTOM)。编码器也可实施压缩方案,包括但不限于诸如LZ或GZIP等一般压缩方案,它们是分层的编码器(构建在其他更多基础编码器上的编码器)。
基于文本的编码提供了一种提高分布式应用程序之间的互操作性的机制。例如,基于文本的编码可支持UTF8、UTF16高位在前(Big-Endian)以及UTF 16低位在前(Little-Endian)字符集。基于文本的编码可支持各种内容类型(ContentTypes),诸如“text/xml”(文本/xml)以及“application/soap+xml”(应用程序/soap+xml)(例如,对应于SOAP 1.1或SOAP 1.2)。
二进制XML编码提供了用于以二进制表示对XML进行编码的机制,该二进制表示可以更紧凑并且对语法分析更有效。基于二进制的编码可支持诸如“application/soap+msbinl“和“application/soap+msbinsessionl”等内容类型。
MTOM编码提供了一种有效地对SOAP信封中的上下文中的二进制XML元素进行编码的机制。MTOM将SOAP信封表示为多部分MIME容器的一部分(例如,许多部分中的一个)。SOAP信封的位置可以变化,以使发送者或接收者缓冲任何对应的附件。例如,具有SOAP信封作为第一元素(例如,一个或多个部分的第一个)的MIME容器可使编写器缓冲任何后续的对应附件。另一方面,具有SOAP作为最后一个元素(例如,一个或多个部分中的最后一个)的MIME容器可使读取器缓冲任何先前的对应附件。
MTOM逻辑上包括SOAP信封内的二进制附件。MTOM对于其他消息编码器是多态的,并且不需要对终端用户编程模型的任何改变。此外,MTOM便于二进制数据的附件保持其本机格式(未编码),由此对SOAP消息保存了空间(与编码的格式相比),并释放了将用于实现(潜在地在计算上是昂贵的)编码算法的资源。
存储163可以是远程或本地大容量存储设备,诸如磁盘驱动器。存储163存储字典162。字典162可以包含一个或多个SOAP和/或XML项,以及对应的减小长度的替换项。例如,字典162可储存值“1”作为对“Envelope”或“http://www.w3.org/2003/05/soap-envelope”的替代。因此,替代可用于在编码之前减小SOAP信封的大小用于通过网络161传输。
字典162可包括静态字典部分和动态字典部分。字典162的静态部分可包括在不同和多样的应用程序之间具有高度的共同性的SOAP和/或XML项。例如,存在许多不同的应用程序(与功能无关)将使用项“Envelope”和“http://www.w3.org/2003/05/soap-envelope”的高度可能性。由此,这些项可被包括在字段162的静态部分内。
字典162的动态部分可包括在较少的多个应用程序之间是共同的,但是不必要在所有应用程序或较多的多个应用程序之间共同的SOAP和/或XML。例如,对银行应用程序公用的项可被包括在利用银行应用程序的计算机系统处的字典的动态部分中。然而,银行项可能不包括在不使用银行应用程序的计算机系统处的字典的动态部分中。当项被表示为在应用程序之间是共同的时候,项可被包括在字典的动态部分中。有时,项可从字典的动态部分中移除(如,当空闲期到期时)。动态字典项与静态字典项在以下方面是不同的动态字典项可以在连接上连同在该连接上发送的引用它们的第一消息一起递增地发送。这一记号化的范围可以被限制在可能重复的消息的部分上,诸如涉及特定的类型化数据结构或方法、参数或返回值的XML名字和名字空间。
计算机系统111包括应用程序代码112、类型转换器113、通道116、编码器117和存储143。应用程序代码112可以是分布式应用程序的一部分,诸如对应于应用程序代码102的服务。应用程序代码112可以是依照方法或面向对象的编程模型开发的代码。由此,在应用程序代码112的模块之间、在应用程序代码112的模块和应用程序代码102的模块之间、以及在应用程序代码112的模块和其他应用程序代码(例如,分布式应用程序的不同的一部分)之间交换的数据可以是类型化的数据,诸如逻辑、二进制、八比特组、十六进制、整数、浮点、字符、字符串、用户定义数据类型、以及用于定义数据结构的这些数据类型的组合。
类型转换器113被配置成将对应于诸如方法调用的参数等类型化对象的类型化数据转换(或序列化)成对应的SOAP元素,以及将SOAP元素转换(或反序列化)成对应于类型化对象的类型数据。例如包括在应用程序代码112中的方法(例如,公共封装类的)类型化对象可用诸如消息协定模型191等消息协定模型的一个或多个消息协定属性(例如,公共语言运行时环境(“CLR”)属性)来注释。类型转换器113可处理消息协定属性,以将类型化对象的类型化数据转换成对应的SOAP元素,诸如转换成XML元素。在某些实施例中,类型转换器113是被配置成依照消息协定模型将CLR方法的参数转换成SOAP元素以及将SOAP元素转换成CLR方法的参数的运行时组件。因此,类型转换器113可利用消息协定模型191将类型化的CLR对象转换成SOAP元素的CLR表示,以及将SOAP元素的CLR表示转换成类型化的CLR对象。
分派器114接收SOAP元素(例如,从适当的通道),并将SOAP元素分派到适当的类型化对象(例如,方法)。当分派器114接收SOAP元素时,分派器114试图将SOAP元素与适当的类型化对象进行匹配。在某些实施例中,分派器114试图将XML元素的各部分(在SOAP元素中)与适当的类型化对象进行匹配。分派器114可将XML元素的各部分与注释对象141中的对象的消息协定属性进行比较。当标识了匹配,分派器114将SOAP元素分派到匹配对象。消息可被分派到注释匹配对象的消息协定属性的Action特性的值上。当没有标识到匹配,分派器114可将SOAP元素分派到默认的对象。
通道116提供了用于发送和接收SOAP信封的I/O抽象。通道116可提供用于使用各种传输协议方案(包括HTTP、TCP和用户数据报协议(“UDP”))、接口方案以及寻址方案中的任一种的抽象。通道116可提供对同样在通道106处提供的传输协议方案、接口方案和定址方案的抽象。
编码器177包括用于将SOAP元素编码成原始的八比特组以及用于将原始的八比特组解码成SOAP元素的一个或多个编码器。由此,尽管编码器117被称为编码器,然而编码器117也可被配置成解码。在计算机体系结构100中,编码器117包括编码器137、138和139。编码器137、138和139的每一个可被配置成不同地编码/解码。例如,编码器137可被配置成支持通过文本XML的SOAP,编码器138可被配置成通过二进制XML的SOAP,而编码器139可被配置成支持消息传输优化机制(MTOM)。
存储143可以是远程或本地大容量存储设备,诸如磁盘驱动器。存储143存储字典162和对象141。字典162可以包含一个或多个SOAP和/或XML项,以及减小长度的对应替代。例如,字典162可储存值“2”作为对“wsa”的替代。因此,替代可用于在编码之前减小SOAP信封的大小用于通过网络161传输。
字典142可包括静态字典部分和动态字典部分。静态部分可包括在不同和多样的应用程序之间具有高度的共同性的SOAP和/或XML项。动态部分可包括在较少的多个应用程序之间是共同的,但是不必要在所有应用程序或较多的多个应用程序之间共同的SOAP和/或XML。
图2示出了灵活地发送类型化应用程序数据的方法200的示例流程图。方法200将参考计算机体系结构100中的模块和数据来描述。
应用程序代码102可生成类型化数据131,即,例如包括在类型化消息中。类型化消息可以依照消息协定模型191来配置,以将SOAP信封表示为类型化的(CLR)对象。类型化数据131可包括方法的参数和/或返回值。例如,应用程序代码102可用使得方法被调用的参数来调用方法。
方法200包括访问对应于类型化对象的类型化对象参数的动作(动作201)。例如,类型转换器103可访问类型化数据131。类型化数据131可包括对应于类型化对象的参数(例如,用于调用方法的参数)。类型化对象可用消息协定模型191的一个或多个消息协定属性,诸如属性171来注释。因此,属性171定义了类型化数据131和对应的SOAP元素(例如,SOAP元素172)之间的映射。
方法200包括依照一个或多个消息协定属性将访问的类型化对象参数映射到SOAP元素的动作(动作202)。例如,类型转换器103可依照属性171将类型化数据131(例如,用于调用方法的参数)映射到SOAP元素172(例如,XML元素)。
方法200包括参考一个或多个消息协定属性来标识SOAP信封内的位置的动作(动作203)。例如,类型转换器103可参考属性171来标识信封132A(在计算机系统101处创建)内的位置。属性171可标识例如信封132A中的头部或消息主体。此外,属性171可标识消息头部或消息主体内指定的位置。由此,对应的SOAP元素可在消息头部或消息主体内排序。
方法200包括将SOAP元素插入到SOAP信封内所标识的位置中的动作(动作204)。例如,类型转换器103可将SOAP元素172插入到信封132A的头部部分或主体部分中(例如,其指定位置)。信封132A可以例如依照所选择的传输、接口和寻址方案通过通道在通道106之间传输。例如,信封132A可以在传输133中封装。
来自编码器107的编码器,诸如编码器128可将封装的信封132A编码成原始的八比特组。在适当时,编码器128参考字典162来替代常用的项。计算机系统101通过网络161向计算机系统111发送原始的八比特组。计算机系统111通过网络161从计算机系统101接收原始的八比特组。
图3示出了用于灵活地接收类型化应用程序数据的方法300的示例流程图。方法300将参考计算机体系结构100中的模块和数据来描述。
来自编码器117的编码器,诸如编码器138可解码原始的八比特组134以展示信封132B。在适当时,编码器138参考字典142以替换在编码前替换的项。解码原始的八比特组134可展示信封132B是例如依照所选择的传输、接口和寻址方案来传输的。例如,解码原始的八比特组134可展示信封132B是在传输133中封装的。
基于传输、接口和/或寻址方案,封装的信封132B可通过适当的通道传输。由于网络161中的中介可能能够在传输期间改变信封132A中的部分(例如,路由头部),因此信封132A和信封132B可包括不同的数据。分派器114接收包括SOAP元素172的信封132B。
方法300包括访问包括在SOAP信封中的SOAP元素的动作(动作301)。例如,分派器114可访问SOAP元素172。
方法300包括标识对应于SOAP元素的类型化对象的动作(动作302)。例如,分派器114可从对象141中(例如,包括在计算机系统111处的各种分布式应用程序组件中的对象的集合)标识对象151。对象151可以是用消息协定模型191的属性181来注释的类型化对象(例如,应用程序代码112的方法)。属性181可定义SOAP元素172和对应的类型化对象参数(例如,用于调用方法的参数)之间的映射。分派器114可将SOAP元素172各部分(例如,XML元素的各部分)与属性181进行匹配,以标识SOAP元素172对应于对象151。在某些实施例中,这包括利用URI(例如,WS寻址动作URI)将SOAP元素172映射到对象151。
方法300包括依照一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数的动作(动作303)。例如,类型转换器113可将SOAP元素172映射到包括类型化数据131的类型化消息(依照属性181)。类型化消息可以依照消息协定模型191来配置,用于将SOAP信封表示为类型化的(CLR)对象。类型化数据131可包括方法的参数和/或返回值。例如,应用程序代码112可接收用使得方法被调用的参数的方法调用(在应用程序102处启动)。
由此,本发明的实施例使得开发者能够控制将方法参数和返回值序列化到消息头部和消息主体的方式。同样,开发者能够控制将方法参数和返回值从消息头部和消息主体中反序列化的方式。因此,开发的应用程序能够保留类型化数据(例如,CLR类型化对象)和SOAP消息通信的灵活性两者的益处。
以下示例代码指令描述了一个注释的类,其中注释的类的特性和字段是用消息协定属性来注释的第1行[MessageContract(Action=“http://createpersonrequest”,
Name=″CreatePersonRequest″)]第2行public class CreatePersonRequest {第3行[MessageBody(Namespace=“http://namespace”,Name=“MyData”,Position=2)]第4行public string OptionalData;第5行[MessageBody(Namespaceuri=“http://namespace”,Name=“TheList”)]第6行Public Ilist<int>Ids;第7行[MessageHeader(Namespaceuri=“http://namespace”,Name=“Request”)]第8行internal Guid RequestId;第9行[MessageHeader(Namespaceuri=“http://namespace”,Name=“Session”,MustUnderstand=true,Relay=false,Actor=http://actor)]第10行internal Guid SessionId;第一行处的[MessageContract]注释了第2行处的公共类CreatePersonRequest,并定义了消息协定“CreatePersonRequest”(例如,消息协定模型191),用于控制SOAP信封的处理和创建。第3行和第5行分别用指示在SOAP信封的主体中的包括的[MessageBody]注释了第4行和第6行。第7行和第8行分别用指示在SOAP信封中的包括的[MessageHeader]注释了第9行和第10行。第3行上的“Position=2”属性指示注释的类型化数据要作为第二个元素被包括在消息主体内。
诸如类型转换器103或类型转换器113等类型转换器可利用诸如消息协定模型191等消息协定模型将示例代码指令转换成以下的示例SOAP信封<soapEnvelope>xmlnssoap=“http://schemas.xmlsoap.org/soap/envelope/”xmlnswsa=“http://schemas.xmlsoap.org/ws/2004/03/addressing”<soapHeader xmlnsx=“http://namespace”>
<xRequest>xc6gf83</Request>
<xSession MustUnderstand=“true”,Relay=“false”,Actor=“http://actor”>
gg57hjfg</xSession>
<wsaAction>http://createpersonrequest</wsaAction>
</soapHeader>
<soapBody xmlnsx=′http://namespace′>
<xTheList>
<xItem>5</xItem>
<xItem>10</xItem>
</xTheList>
<xMyData>some data here</xMyData>
</soapBody></soapEnvelope>
诸如类型转换器103或类型转换器113等类型转换器也可利用诸如消息协定模型191等消息协定模型将示例SOAP信封转换成示例代码指令。在示例SOAP信封中,“MyData”元素在SOAP信封主体的第二个位置上。
在本发明的某些实施例中,传输流用于补偿每次在一个时刻不能完全在存储器中表示的较大的消息。即,传输流对于大于对处理消息的服务可用的存储器(例如,由于物理或分配的存储器限制)的消息是有利的。传输流可包括流传送消息的专用传输连接(TCP套接字、命名管道、HTTP连接等)。要使用传输流的计算机系统可依照适当的传输工厂的传输模式特性(例如,TcpChannelFactory/TcpListenerFactory、NamedPipeChannelFactory/NamedPipeListenerFactory、以及HttpChannelFactory/HttpListenerFactory)来配置。
传输流可以通过用于注释类型化对象的对应的传输绑定元素(例如,TransportBindingElement、NamedPipeTransportBindingElement以及HttpTransportBindingElement)来启用。传输特性可基于通道类型而改变。例如,对于TCP或NamedPipe(命名管道),可使用IOutputChannel/IInputChannel或IDuplexSessionChannel(它使用一对IOutputChannel/IInputChannel)。对于HTTP,可使用IRequestChannel/IReplyChannel、IRequestSessionChannel/IReplySessionChannel、IOutputChannel/IInputChannel或IFullDuplexChannel。当对给定的数据协定配置流传送时,适当的通道(例如,在通道106和/或116中)可便于请求和创建正确的通道类型。
传输流对于消息的读取器是透明的。即,应用程序无需不同地编写其本身以处理该消息。应用程序只需使用公共XML元素API(例如,XmlReader)顺序地读取值。传输绑定元素可通过例示传输绑定元素并向该元素上的特性分配值来配置。传输绑定元素也可通过CLR配置(例如,myapp.config文件)来配置。
图4示出了适用于本发明的原理的操作环境。图4及以下讨论提供了对适于在其中实现本发明的计算环境的简要概括描述。尽管并非必须,但本发明将在诸如由计算机系统执行的程序模块等计算机可执行指令的一般上下文环境中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据类型。计算机可执行指令、相关的数据结构以及程序模块表示了用于执行这里揭示的方法的动作的程序代码装置的示例。
参考图4,用于实现本发明的示例系统包括计算机420形式的通用计算设备,包括处理单元421、系统存储器422以及将包括系统存储器422的各类系统组件耦合至处理单元421的系统总线423。处理单元421可以执行被设计成实现计算机420的特征,包括本发明的特征的计算机可执行指令。系统总线423可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线以及使用各类总线体系结构中的任一种的局部总线。系统存储器包括只读存储器(ROM)424和随机存取存储器(RAM)425。基本输入/输出系统(BIOS)426,包含如在启动时协助在计算机420内的元件之间传输信息的基本例程,可储存在ROM 424中。
计算机420也可包括用于对磁硬盘439进行读写的磁硬盘驱动器427、用于对可移动磁盘429进行读写的磁盘驱动器428以及用于对可移动光盘431如CD-ROM或其它光介质进行读写的光盘驱动器430。磁硬盘驱动器427、磁盘驱动器428以及光盘驱动器430分别通过硬盘驱动器接口432、磁盘驱动器接口433和光盘驱动器接口434连接至系统总线423。驱动器及其相关的计算机可读介质为计算机420提供了计算机可执行指令、数据结构、程序模块和其它数据的非易失性存储。尽管这里描述的示例环境采用了磁硬盘439、可移动磁盘429以及可移动光盘431,然而也可以使用用于储存数据的其它类型的计算机可读介质,包括盒式磁带、闪存卡、数字多功能盘、Bernoulli盒式磁盘、RAM、ROM等等。
包括一个或多个程序模块的程序代码装置可储存在硬盘439、磁盘429、光盘431、ROM424或RAM425中,包括操作系统435、一个或多个应用程序436、其它程序模块437以及程序数据438。用户可以通过键盘440、定位设备442或其它输入设备(未示出),如麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等向计算机420输入命令和信息。这些和其它输入设备通常通过耦合至系统总线423的输入/输出接口446连接到处理单元421。输入/输出接口446逻辑上表示各种各样不同接口中的任一种,诸如串行端口接口、PS/2接口、并行端口接口、通用串行总线(USB)或电子与电气工程师协会(“IEEE”)1394接口(即,火线接口),或甚至可以逻辑上表示不同接口的组合。
监视器447或其他显示设备也通视频接口448连接到系统总线423。其它外围输出设备(未示出),如扬声器和打印机,也可被连接到计算机系统420。
计算机系统420可连接到网络,诸如办公室范围或企业范围计算机网络、家庭网络、内联网和/或因特网。计算机系统420可通过这类网络与诸如远程计算机系统、远程应用程序和/或远程数据库等外部源交换数据。
计算机系统420包括网络接口453,通过该接口,计算机系统420从外部源接收数据和/或向外部源发送数据。如图4中所示的,网络接口453便于通过链路451与远程计算机系统483交换数据。网络接口453可以逻辑上表示一个或多个软件和/或硬件模块,诸如网络接口卡和对应的网络驱动器接口规范(“NDIS”)栈。链路451表示网络的一部分(例如,以太网段),而远程计算机系统483表示网络的节点。
同样计算机系统420包括输入/输出接口446,通过该接口,计算机系统420可从外部源接收数据和/或向外部源发送数据。输入/输出接口446通过链路459被耦合到调制解调器454(例如,标准调制解调器、电缆调制解调器或数字用户线(“DSL”)调制解调器),通过该接口,计算机系统420从外部源接收数据和/或向外部源发送数据。如图4中所示的,输入/输出接口446和调制解调器454便于通过链路452与远程计算机系统493交换数据。链路452表示网络的一部分,而远程计算机系统493表示网络的节点。
尽管图4表示了适用于本发明的操作环境,然而,本发明的原理可用于能够(如有必要在适当的修改下)实现本发明的原理的任何系统。图4所示的环境仅是说明性的,并且决不表示其中可实现本发明的各种各样环境的甚至一小部分。
依照本发明,包括应用程序代码、客户机代理、服务、类型转换器、通道、消息编码器/解码器、以及分派器和相关联的数据,包括类型化数据SOAP元素、传输、原始的八比特组、字典以及对象的模块可被储存在与计算机系统420相关联的任何计算机可读介质中并可从其中访问。例如,这些模块和相关联的程序数据的各部分可以包括在操作系统435、应用程序436、程序模块437和/或程序数据438中,以储存在系统存储器422中。
当诸如磁硬盘439等大容量存储设备被耦合到计算机系统420,这些模块和相关联的程序数据也可被储存在大容量存储设备中。在网络化环境中,相对于计算机420所描述的程序模块或其部分可储存在远程存储器存储设备中,诸如与远程计算机系统483和/或远程计算机系统493相关联的系统存储器和/或大容量存储设备中。这些模块的执行可以在如上所述的分布式计算环境中进行。
本发明可以用其它特定的形式来实施,而不脱离其精神或本质特征。所描述的实施例在所有方面都被认为是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非以上的描述来指示。落入权利要求书的等效技术方案的意义和范围内的所有改变都包含在其范围之内。
权利要求
1.在可连同一个或多个其它计算机一起网络连接到网络的计算机系统中,一种灵活地发送类型化应用程序数据的方法,所述方法包括访问对应于类型化对象的类型化对象参数的动作,所述类型化对象是用消息协定模型的一个或多个消息协定属性来注释的,所述一个或多个消息协定属性定义了类型化对象参数和对应的SOAP元素之间的映射;依照所述一个或多个消息协定属性将所访问的类型化对象参数映射到SOAP元素的动作;参考所述一个或多个消息协定属性来标识SOAP信封内的位置的动作;以及将所述SOAP元素插入到所述SOAP信封中所标识的位置中的动作。
2.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问表示方法的参数的类的动作。
3.如权利要求2所述的方法,其特征在于,访问表示方法的参数的类的动作包括访问表示公共语言运行时环境方法的参数的公共类的动作。
4.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问用动作URI注释的类型化对象的动作。
5.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问表示方法返回值的类的动作。
6.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问SOAP元素的公共语言运行时环境表示的动作。
7.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问类型化消息的动作。
8.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问用消息协定属性注释的已注释类型化对象参数的动作,所述消息协定属性指示类型化对象参数的XML表示要包括在SOAP信封头部中。
9.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问用消息协定属性注释的已注释类型化对象参数的动作,所述消息协定属性指示类型化对象参数的XML表示要包括在SOAP信封主体中。
10.如权利要求1所述的方法,其特征在于,访问对应于类型化对象的类型化对象参数的动作包括访问已注释类型化对象参数的动作,所述已注释类型化对象参数是用一个或多个消息协定属性来注释的,所述一个或多个消息协定属性是从指示SOAP信封内的位置、名字、名字空间URI、类型化对象参数是否必须被理解、类型化对象参数是否可被中继、以及类型化对象参数的行动者的属性中选出的。
11.如权利要求1所述的方法,其特征在于,依照所述一个或多个消息协定属性将所访问的类型化对象参数映射到SOAP元素的动作包括将所访问的类型化对象参数序列化到SOAP元素的动作。
12.如权利要求1所述的方法,其特征在于,依照所述一个或多个消息协定属性将所访问的类型化对象参数映射到SOAP元素的动作包括将所访问的类型化对象参数映射到对应的XML元素的动作。
13.如权利要求1所述的方法,其特征在于,参考所述一个或多个消息协定属性来标识SOAP信封内的位置的动作包括参考标识SOAP信封的头部部分的消息协定属性的动作。
14.如权利要求1所述的方法,其特征在于,参考所述一个或多个消息协定属性来标识SOAP信封内的位置的动作包括参考标识SOAP信封的主体部分的消息协定属性的动作。
15.如权利要求1所述的方法,其特征在于,将所述SOAP元素插入到所述SOAP信封中所标识的位置中的动作包括将对应的XML指令插入到所述SOAP信封的头部部分中的动作。
16.如权利要求1所述的方法,其特征在于,将所述SOAP元素插入到所述SOAP信封中所标识的位置中的动作包括将对应的XML指令插入到所述SOAP信封的主体部分中的动作。
17.如权利要求1所述的方法,其特征在于,还包括将所述SOAP信封编码成原始的八比特组的动作;以及将所述原始的八比特组发送到接收计算机系统的动作。
18.如权利要求17所述的方法,其特征在于,将所述SOAP信封编码成原始的八比特组的动作包括将所述SOAP信封编码成其中原始八比特组的大小没有预定义限制的八比特组的动作。
19.如权利要求17所述的方法,其特征在于,将所述SOAP信封编码成原始的八比特组的动作包括生成所述SOAP信封的基于文本的编码的动作。
20.如权利要求17所述的方法,其特征在于,将所述SOAP信封编码成原始的八比特组的动作包括使用消息传输优化机制来编码所述SOAP信封的动作。
21.如权利要求17所述的方法,其特征在于,将所述SOAP信封编码成原始的八比特组的动作包括生成所述SOAP信封的基于二进制的编码的动作。
22.如权利要求21所述的方法,其特征在于,生成所述SOAP信封的基于二进制的编码的动作包括用减小长度的替代项替代一个或多个SOAP项和/或XNL项,使得所述SOAP信封可被更有效地传输的动作。
23.如权利要求17所述的方法,其特征在于,将所述原始的八比特组发送到接收计算机系统的动作包括将所述原始的八比特组流传送到所述接收计算机系统的动作。
24.在可连同一个或多个其它计算机一起网络连接到网络的计算机系统中,一种灵活地接收类型化应用程序数据的方法,所述方法包括访问包括在SOAP信封中的SOAP元素的动作;标识对应于所述SOAP元素的类型化对象的动作,所述类型化对象是用消息协定模型的一个或多个消息协定属性来注释的,所述一个或多个消息协定属性定义了SOAP元素和对应的类型化对象参数之间的映射;以及依照所述一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数的动作,所述类型化对象参数用于提交给所标识的类型化对象。
25.如权利要求24所述的方法,其特征在于,还包括从发送计算机系统接收原始的八比特组的动作;以及将所述原始的八比特组解码成所述SOAP信封的动作。
26.如权利要求25所述的方法,其特征在于,从发送计算机系统接收原始的八比特组的动作包括接收流传送的八比特组的动作。
27.如权利要求25所述的方法,其特征在于,将所述原始的八比特组解码成所述SOAP信封的动作包括解码所述SOAP信封的基于文本的编码的动作。
28.如权利要求25所述的方法,其特征在于,将所述原始的八比特组解码成所述SOAP信封的动作包括解码所述SOAP信封的基于二进制的编码的动作。
29.如权利要求28所述的方法,其特征在于,解码所述SOAP信封的基于二进制的编码的动作包括用原始的SOAP项和/或XML项来替代减小长度的替代项,使得所述SOAP信封被返回到先前的配置的动作。
30.如权利要求25所述的方法,其特征在于,将所述原始的八比特组解码成所述SOAP信封的动作包括使用消息传输优化机制来解码所述原始的八比特组的动作。
31.如权利要求24所述的方法,其特征在于,访问包括在SOAP信封中的SOAP元素的动作包括从所述SOAP信封的头部部分中访问XML元素的动作。
32.如权利要求24所述的方法,其特征在于,访问包括在SOAP信封中的SOAP元素的动作包括从所述SOAP信封的主体部分中访问XML元素的动作。
33.如权利要求24所述的方法,其特征在于,标识对应于所述SOAP元素的类型化对象的动作包括将所述SOAP信封中的XML元素与已注释类的消息协定属性进行比较的动作。
34.如权利要求24所述的方法,其特征在于,标识对应于所述SOAP元素的类型化对象的动作包括访问对应于所述类型化对象的URI的动作。
35.如权利要求24所述的方法,其特征在于,标识对应于所述SOAP元素的类型化对象的动作包括标识表示方法的参数的类的动作。
36.如权利要求35所述的方法,其特征在于标识表示方法的参数的类的动作包括访问表示公共语言运行时环境方法的参数的公共类的动作。
37.如权利要求35所述的方法,其特征在于,标识对应于所述SOAP元素的类型化对象的动作包括将所述SOAP信封分派到适当的方法的动作。
38.如权利要求24所述的方法,其特征在于,依照所述一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数的动作包括将所述SOAP元素反序列化到类型化对象参数的动作。
39.如权利要求24所述的方法,其特征在于,依照所述一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数的动作包括将XML元素映射到对应的类型化对象参数的动作。
40.如权利要求24所述的方法,其特征在于,还包括用所述类型化对象参数调用方法的动作。
41.一种在可连同一个或多个其它计算机一起网络连接到网络的计算机系统中使用的计算机程序产品,所述计算机程度产品用于实现一种灵活地发送类型化应用程序数据的方法,所述计算机程序产品包括其上储存有计算机可执行指令的一个或多个计算机可读介质,当所述指令由处理器执行时,使所述计算机系统执行以下动作访问对应于类型化对象的类型化对象参数,所述类型化对象是用消息协定模型的一个或多个消息协定属性来注释的,所述一个或多个消息协定属性定义了类型化对象参数和对应的SOAP元素之间的映射;依照所述一个或多个消息协定属性将所访问的类型化对象参数映射到SOAP元素;参考所述一个或多个消息协定属性来标识SOAP信封内的位置;以及将所述SOAP元素插入到所述SOAP信封中所标识的位置中。
42.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统访问对应于类型化对象的类型化对象参数的所述计算机可执行指令包括当被执行时使所述计算机系统访问表示公共语言运行时环境方法的参数的公共类的计算机可执行指令。
43.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统访问对应于类型化对象的类型化对象参数的所述计算机可执行指令包括当被执行时使所述计算机系统访问表示公共语言运行时环境方法的返回值的公共类的计算机可执行指令。
44.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统依照所述一个或多个消息协定属性将所访问的类型化对象映射到SOAP元素的所述计算机可执行指令包括当被执行时使所述计算机系统将所访问的类型化对象参数序列化到SOAP元素的计算机可执行指令。
45.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统参考所述一个或多个消息协定属性来标识SOAP信封内的位置的所述计算机可执行指令包括当被执行时使所述计算机系统参考标识SOAP信封的头部部分的消息协定属性的计算机可执行指令。
46.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统参考所述一个或多个消息协定属性来标识SOAP信封内的位置的所述计算机可执行指令包括当被执行时使所述计算机系统参考标识SOAP信封的主体部分的消息协定属性的计算机可执行指令。
47.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统将所述SOAP元素插入到所述SOAP信封内所标识的位置中的所述计算机可执行指令包括当被执行时使所述计算机系统将所述SOAP元素插入到所述SOAP信封的头部部分中的计算机可执行指令。
48.如权利要求41所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统将所述SOAP元素插入到所述SOAP信封内所标识的位置中的所述计算机可执行指令包括当被执行时使所述计算机系统将所述SOAP元素插入到所述SOAP信封的主体部分中的计算机可执行指令。
49.一种在可连同一个或多个其它计算机一起网络连接到网络的计算机系统中使用的计算机程序产品,所述计算机程度产品用于实现一种灵活地接收类型化应用程序数据的方法,所述计算机程序产品包括其上储存有计算机可执行指令的一个或多个计算机可读介质,当所述指令由处理器执行时,使所述计算机系统执行以下动作访问包括在SOAP信封中的SOAP元素;标识对应于所述SOAP元素的类型化对象,所述类型化对象是用消息协定模型的一个或多个消息协定属性来注释的,所述一个或多个消息协定属性定义了SOAP元素和对应的类型化对象参数之间的映射;以及依照所述一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数,所述类型化对象参数用于提交给所标识的类型化对象。
50.如权利要求49所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统访问包括在SOAP信封中的SOAP元素的所述计算机可执行指令包括当被执行时使所述计算机系统从所述SOAP信封的头部部分中访问XML元素的计算机可执行指令。
51.如权利要求49所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统访问包括在SOAP信封中的SOAP元素的所述计算机可执行指令包括当被执行时使所述计算机系统从所述SOAP信封的主体部分中访问XML元素的计算机可执行指令。
52.如权利要求49所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统标识对应于所述SOAP元素的类型化对象的所述计算机可执行指令包括当被执行时使所述计算机系统访问对应于所述类型化对象的URI的计算机可执行指令。
53.如权利要求49所述的计算机程序产品,其特征在于,当被执行时使所述计算机系统依照所述一个或多个消息协定属性将所访问的SOAP元素映射到类型化对象参数的所述计算机可执行指令包括当被执行时使所述计算机系统将所述SOAP元素反序列化到类型化对象参数的计算机可执行指令。
全文摘要
本发明涉及使用简单对象访问协议(“SOAP”)来交换类型化对象,诸如用于调用方法的参数。一种计算机系统访问对应于类型化对象的类型化对象参数。该类型化对象是用消息协定模型的一个或多个消息协定属性来注释的,该消息协定模型定义了类型化对象参数和对应的SOAP元素之间的映射。该计算机系统利用消息协定属性将类型化对象参数映射到SOAP元素,并将SOAP元素插入到SOAP信封中。接收计算机系统访问该SOAP元素,并利用消息协定属性将SOAP元素映射回类型化对象参数。
文档编号H04L29/06GK1783882SQ20051011887
公开日2006年6月7日 申请日期2005年11月3日 优先权日2004年12月3日
发明者D·沃滕代克, D·M·珀迪, E·B·克里斯滕森, K·D·沃尔夫, M·J·库尔森, M·J·马鲁切克, M·S·威尔诺, N·H·杰塔南达尼, R·T·斯特戈尔, S·H·法瑞斯, V·B·巴拉约干 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1