动态服务代理的制作方法

文档序号:7952123阅读:152来源:国知局
专利名称:动态服务代理的制作方法
技术领域
本发明一般涉及web服务。更具体地,本发明能够为没有被开发成在web服务环境内通信的传统应用程序组件生成动态web服务和动态服务代理。该服务代理也有利地通过提供web服务客户机和传统接口之间的抽象层来允许开发员对展示给web服务客户机的接口进行更紧密的控制。
背景技术
计算机系统和相关技术影响了社会的方方面面。实际上,计算机系统处理信息的能力改变了人们生活和工作的方式。计算机系统现在通常执行大量任务(例如,文字处理、调度、数据库管理等),这些任务在计算机系统出现之前都是手动操作的。最近,计算机系统被彼此耦合来形成计算机网络,在计算机网络上,计算机系统可电子地通信以共享数据。Web服务是推动此类计算机系统之间的通信的驱动力,并彻底改变了人们构建和使用软件的方式。
Web服务使得应用程序能共享数据,并更强有力地能够调动来自其它应用程序的能力,而不必关心这些应用程序是如何被构建的、它们运行在什么操作系统或平台上、以及使用什么设备来访问它们。通过包括SOAP(简单开放访问协议)、XML(可扩展标记语言)、UDDI(通用描述发现集成)、WSDL(Web服务描述语言)等行业标准协议经由因特网来调用Web服务。尽管web服务仍旧彼此独立,但它们可以松散地链接成执行特定任务的协作组。
通常,web服务网络上的电子通信包括请求对服务器计算机系统(下文中被称为“服务器”、“服务”或“web服务”)处的网络服务(例如,web服务)的访问的客户计算机系统(下文中被称为“客户机”)。从而,客户机向服务发送对其系统资源的特定访问的请求,其中如果该客户机被授权和确认,那么服务使用提供所需信息的响应消息来响应。当然,客户机和服务之间有其它消息通信模式可用,包括简单的单消息以及更复杂的多消息交换,例如通知、请求-响应、发布-订阅模式、轮询、踢-推(kick-push)、排队等。而且,这些类型的通信由客户机和服务双方在分布式系统(例如,web服务)的契约中定义的各种要求和能力来管理。
契约是服务(或客户机)行为的可见方面的表达。契约由机器可读语言和人类语言的混合来表示。除了显然可能提供额外精确性之外,机器可读语言使得能够使用工具来构造部分服务实现、自动化服务部署、交换监察/确认消息、管理服务以及允许大量其它网络相关的功能。然而,由于机器可读语言在表达力方面的限制,人类语言仍旧是契约的重要组成部分,主要用于描述消息和消息交换模式语义。
网络协议描述语言(例如,WSDL)提供用于以公共或标准语言描述契约(例如,web服务契约)的总包装或规范。这样的规范使得开发员和开发员工具易于创建和解释契约。这些网络协议描述语言(下文中被称为“NPDL”)具有广泛的工具套件,这很大程度地说明了其流行度。
在web服务出现之前,多年来,大量分布式应用程序是使用来自各个厂商的基于传统组件的体系结构(例如,COM(组件对象模型)、DCOM(分布式组件对象模型)、CORBA(公用对象请求代理程序体系结构))来编写的。然而,随着基于标准的web服务的到来和出现,存在对将来自这些传统组件的商业逻辑展示为web服务的兴趣。作为示例,且不考虑以后的方法,本发明一般采用诸如支持以下接口的应用程序组件interface IStockSystem:IDispatch{HRESULT GetProductDescription([in]BSTR ProductID,[out,retval]BSTR*ProdDesc);HRESULT GetProductInventory([in]BSTR ProductID,[out,retval]short*ProdCount);};且从该组件定义中产生具有以下WSDL片段中示出的若干操作的相应web服务层<wsdl:portType name="StockSystem">
<wsdl:operation name="GetProductDescription">
<wsdl:input message="tns:GetProductDescriptionIn"/>
<wsdl:output message="tns:GetProductDescriptionOut"/>
</wsdl:operation>
<wsdl:operation name="GetProductInventory">
<wsdl:input message="tns:GetProductInventoryIn"/>
<wsdl:output message="tns:GetProductInventoryOut"/>
</wsdl:operation>
</wsdl:portType>
迄今,仅遵循了若干主要模式或方法用于在web服务环境内转换或使用传统组件。一种方法是迁移或修改,这需要开发员修改该组件的源代码以添加web服务支持。当该应用程序被编译和执行时,该应用程序将以适当的web服务支持启动,同时仍允许传统客户机连接至该底层应用程序。
另一种方法是使用工具和元数据驱动方法,这产生静态包装服务。并非要求修改组件源代码,而是该方法使用更外部的方法来为组件检查现有的已注册源代码,以确定该组件应提供的服务。这产生了外部但至少一开始与底层的未经修改的组件一致的静态web服务包装。
尽管上述修改和静态的方法允许在web服务环境中访问传统组件的业务逻辑,但仍旧存在与这两个方法均相关联的缺陷和问题。例如,因为修改方法即使当不期望改变业务逻辑时也需要修改源代码,与其说是简单的管理过程,倒不如说这是一个开发任务。从而,这样的任务是超出典型管理员角色的范围的,且要求额外的技能。另外,开发修改以启用web服务在使用原始代码环境的情况下可能不可用。例如,在修改使用不再支持的传统语言编写的组件的情况中,该组件首先必须被移植到当前的语言。从而,最初看上去如向方法添加属性的修改实际上是对不同语言、运行环境和开发环境的迁移。
在静态使用工具方法中,当修改底层组件或部署新版本时存在问题。在这样的情况中,这些改变在重新生成包装服务之前不会自动反映在该服务中。另外,对web服务操作,存在服务和底层组件之间的显式依赖性。从而,必须注意确保该组件和web服务的生存周期是同步的(即,包装服务要求该组件为活动的,而该组件要求包装为活动的)。而且,取决于环境和包装的外部性质,一般存在要被部署和管理的其它组件。换言之,如果该组件被移至另一台机器,那么该包装组件必须也相应被标识和移动。
解决上述修改和静态方法的缺陷和缺点的一种方法是,如此处所述和在2005年3月8日提交的名为“DYNAMIC SERVICE GENERATION FOR LEGACYCOMPONENTS(对传统组件的动态服务生成)”的美国专利申请中更详细描述的动态生成web服务,该专利申请通过引用包含在此。然而,该方法(以及上述系统)仍旧具有各种缺点。例如,这些系统的一个问题是,存在带有由于多种原因而不能被修改或不适于作为web服务展示的接口的现有分布式应用程序。例如,它们可能含有需要例如SOAP消息等不能被转换成web服务消息的参数的调用。作为其替代,或与其相结合,它们可能是以需要对单步操作进行来回方法调用的方式来编写的,而典型的web服务对此不支持。
作为不适于展示为web服务的接口的示例,考虑以下接口[object,uuid(a0753298-46bc-444e-a89b-b66d8a0cec57)]interface IOrderDescription:IUnknown{HRESULT GetProductName([out]BSTR*ppszName);
HRESULT GetQuantity([out]DWORD*pdwQuantity);
HRESULT GetNegotiatedPrice([out]DWORD*pdwPrice);
}[object,uuid(5605102f-d914-4633-a974-4369a1af8db9)]interface IComPlusObject:IUnknown{HRESULT PlaceOrder([in]IOrderDescription*pOrderDescription);
}如所示的,通过现有的COM对象展示IComPlusObject,并采用实现该IComPlusObject的对象(即,IOrderDescription)作为其单个参数。然而,注意,该IComPlusObject不能按原样被展示为web服务,因为典型的web服务基础架构不支持采用对象作为参数的方法调用。
为了弥补这些缺陷,目前的实践允许如上在修改方法中所述的对至少组件和组件接口(有可能是整个应用程序)的重写。如上所述,尽管如此,用于通过重写创建新服务的该初步方法是一个重要的任务。因为客户机和服务通过使用相同接口的相同实例而被紧密耦合,因此客户机和服务器双方均必须在对该服务的改变之后被更新。另外,该改进的重写一般不在大多数用户的技能之内。
至少对前述原因,需要为传统组件提供web服务和业务逻辑,而无需开发员修改底层组件源代码,从而允许组件修改或版本更新,以及支持服务与底层组件之间的显式依赖性。另外,需要提供允许开发员为不能工作或低效的组件接口创建接口,而无需重写该应用程序组件或组件接口的机制。

发明内容
在Web服务环境中为传统组件提供服务和业务逻辑的典型系统的上述缺陷和缺点通过本发明的示例性实施例得以克服。例如,本发明提供用于通过由开发员为经由未被开发成在web服务环境中通信的传统接口通信的传统组件创建的自定义对象来支持web服务的机制。该自定义对象允许开发员紧密控制web服务的互操作性、健壮性和效率,而无需重写该传统组件或组件接口。
例如,本发明的实施例允许从web服务客户机接收对访问由具有传统组件的应用程序提供的服务的请求。该传统组件使用未被开发成在web服务环境中通信的传统接口通信。之后,该请求被标识为对应于由服务代理控制的服务,服务代理是由开发员创建的将代理接口展示为该web服务客户机和该传统接口之间的抽象的自定义对象。至少一部分请求通过该代理接口传递给该服务代理的实例以供进一步处理。服务代理被配置成通过对一个或多个传统组件的调用、对该服务代理实例的调用或对该应用程序或该服务代理实例外部的其它系统的调用中的一个或多个来处理该请求的至少一部分。
其它示例性实施例允许初始化由开发员创建的自定义对象。在该实施例中,接收初始化应用程序的请求,其中该应用程序包含用于提供服务的一个或多个传统组件。而且,该传统组件使用未被开发成在web服务环境中通信的传统接口通信。基于该初始化应用程序的请求,将服务代理实例标识为需要被生成,其中该服务代理是由开发员创建的将代理接口展示为web服务客户机和该传统接口之间的抽象的自定义对象。之后,访问描述将被展示给该web服务客户机的代理接口的元数据。该元数据然后用于生成包含该代理接口的服务代理的实例。该服务代理的实例还被配置成通过对该一个或多个传统组件的调用、对该服务代理实例的调用或对该应用程序或服务代理实例外部的其它系统的调用中的一个或多个来处理来自该web服务客户机的请求的至少一部分。
本发明的其它特征和优点将在随后的描述中描绘,且其中部分可通过阅读该描述而变得明显,或者可以通过实现本发明来领会。本发明的特征和优点可以通过所附权利要求书中特别指出的装置及其组合来实现和获取。通过阅读以下描述和所附权利要求书,本发明的这些和其它特征将是显而易见的,或者也可以通过如之后所述对本发明的实现来领会。


为了描述可获取本发明上述及其它优点和特征的方式,将参考在附图中示出的本发明的特定实施例呈现以上简要描述的本发明的更具体描述。要理解,这些附图仅描述本发明的典型实施例,从而不被认为是对其范围的限制,本发明将通过使用附图以额外的特性和细节来描述和解释,附图中图1A示出了根据本发明的示例实施例,被配置成创建动态web服务的分布式系统;图1B示出了根据本发明的示例实施例,被配置成通过服务代理和动态web服务来提供web服务的分布式系统;图2示出了根据示例实施例,通过由开发员创建的自定义对象来提供web服务的方法的流程图;图3示出了根据示例实施例,启动服务代理的实例的方法的流程图;以及图4示出了为本发明提供合适的操作环境的示例系统。
具体实施例方式
本发明提供用于为没有被开发、设计或编码成在web服务环境内通信的传统应用程序组件生成动态web服务和代理服务的实例的方法、系统和计算机程序产品。该代理服务是允许开发员更紧密控制web服务的互操作性、健壮性和效率,而无需重写该传统组件或接口的自定义对象或代码。本发明的实施例可包括含有将在以下更详细讨论的各种计算机硬件组件或模块的专用或通用计算机。
在第一个示例实施例中,本发明提供允许管理事件在初始化传统应用程序组件的过程中触发或引起生成动态web服务的机制。类似于其它类型的静态使用工具的方法,如此处所支持的动态方法使用描述用于与传统组件通信的接口的可用元数据。并非通过一次性或偶然使用工具来生成和展现web服务,而是示例实施例允许通过支持基础架构来生成web服务,作为应用程序初始化的一个标准部分。当停止应用程序之后,提供停止相应的动态web服务并删除用于生成该动态web服务的web服务描述的终止序列。从而,每次启动应用程序时,就将需要咨询可用的元数据,并在进行中构建一致的服务。
图1A示出了如上所述的各种示例实施例。如图所示,提供支持web服务客户机145和传统客户机105两者的分布式系统100,从而允许访问面向服务110的应用程序125。更具体地,提供具有包含传统组件135的应用程序125的服务110。示例实施例允许管理员(未示出)设置管理配置设置155,它指示动态web服务175应在应用程序125启动之后生成。从而,基于管理配置设置155,在应用程序125启动之后(且可能依据从应用程序专用的配置文件中引出的其它配置),web服务初始化器180将从目录数据库165中访问元数据160。
注意,示例实施例允许初始化应用程序125(以及相应的动态web服务175)的若干方式。例如,对初始化应用程序125的请求可以通过来自管理员用户界面的输入接收。其它示例实施例允许在接收对访问由应用程序125提供的服务的请求140(或其它类似类型的请求)之后自动初始化应用程序125。当然,初始化应用程序125的其它公知的方式也可用于本发明。从而,除非明确地要求保护,否则用于初始化应用程序124的任何特定的方式或进程仅用于说明性的目的,而不意味着限制或缩小本发明的范围。
如上所述,无论应用程序125是如何被初始化的,在初始化后访问描述组件接口的元数据160。该元数据160是关于动态web服务175如何与传统组件135通信的信息。换言之,元数据160特别地指示以下的一个或多个传统组件135需要何种调用115;将何种参数115传递给传统组件135;应以什么顺序传递参数115;以及指示例如是否从传统组件135接收返回值120的消息交换模式等。注意,不是所有的调用115都包含参数115。例如,FormatAllAvailableDisks()(格式化所有可用磁盘)和其它调用的操作不需要任何参数。从而,元数据160可具有或没有关于要传递给传统组件135的参数115的细节,这当然取决于要作出的调用115的类型。
在任何情况中,访问元数据160之后,web服务初始化器180可生成web服务描述150或契约(例如,WSDL文档)。另外,web服务初始化器180可在运行时使用web服务描述150来启动动态web服务175。另外,可能必须使用web服务描述150来创建与其相一致的web服务客户机145。注意,尽管生成的web服务描述150用于创建动态web服务175,但是这样的事件对本发明不是关键的。换言之,web服务初始化器180在访问元数据160之后可自动生成动态web服务175,而无需使用web服务描述150。从而,除非明确地要求保护,否则使用web服务描述150用于生成动态web服务175仅是为说明性的目的,而不意味着限制或缩小本发明的范围。
一旦动态web服务175被创建且传统组件135为活动,web服务客户机145作出对访问由传统组件135提供的服务的请求140。请求140可包括诸如请求由传统组件135提供的服务的操作和/或传统组件135需要的参数115(如果存在)等内容。在接收请求140之后,并基于该请求内的操作,动态web服务175检查请求140的内容,并用适当的参数(如果有)对对传统组件135作出适当的调用115。换言之,动态web服务175作为公用web服务请求140(例如,XML文档)与适当的调用及所需参数115(如果有)之间的转换器,用于与传统组件135通信。
如前所述,除了适当的调用115和所需参数175(如果有)以外,动态web服务175应被配置成了解用于传统组件135的适当消息交换模式。从而,如果需要返回值120,那么动态web服务175可期望这样的返回。该返回值120然后可在由动态web服务175生成的适当的web服务响应130内格式化。注意,尽管该示例的消息交换模式是请求-响应,但其它消息交换模式也可用于本发明。从而,除非明确地要求保护,否则使用如此处所述的任何特定类型的消息交换模式仅用于说明性的目的,而不意味着限制或缩小本发明的范围。
其它示例实施例提供应用程序125的终止序列。当关闭或停止传统应用程序125时,示例性实施例允许终止动态web服务175,并例如通过将web服务描述150发送给回收站170以将其删除。从而,因为web服务描述150不被保存和/或重用,所以如果修改传统组件175或提供更新的版本,也不会存在不一致性。
注意,本发明也支持传统客户机105。从而,传统客户机105可使用适当的参数115(如果有)对传统应用程序125直接作出调用。返回值120(如果有)也可直接从传统应用程序125递送给传统客户机105。
如前所述,尽管上述动态web服务克服了与对传统组件的web服务的修改和静态方法相关联的现有问题,但是仍旧存在对该动态系统的增强或改进的需求。如上所述,例如,由于多种原因,可能无法改变接口或接口不适于被展示为web服务。从而,本发明的示例性实施例提供允许开发员定义新接口并插入实现这些新接口的自定义转换代码的机制。这些新接口然后可以按照从传统组件接口中抽象出web服务客户机的方式被展示给web服务客户机。实现该新接口的对象在此处被称为“服务代理”,且该新接口将通常被称为“代理接口”。
作为关于如何能够实现服务代理的示例,回想背景技术一节中的示例,其中IComPlusObject采用对象引用作为单个参数。如前所述,因为典型的web服务基础架构不支持采用对象作为参数的方法调用,IComPlusObject将失败且该服务对非传统客户机不可用。然而,示例性实施例提供通过允许用户或开发员定义实现以下接口的服务代理来允许上述IComPlusObject接口被展示为web服务的机制[ServiceContract]interface ISurrogateInterface{void PlaceOrder(string productName,int quantity,int price);}开发员然后可通过创建服务代理以填入对传统COM对象的PlaceOrder方法的IOrderDescription参数来实现该新的PlaceOrder函数。
注意,服务代理向web服务客户机展示的代理接口不需要以任何方式相关于用于传统组件的传统接口。例如,代理接口可以含有与传统接口不同数量的调用,且服务代理调用可以按照任何方式被映射至现有传统调用。事实上,如将在以下更详细描述,服务代理可被配置成处理请求或其部分而无需访问传统组件、或通过处理请求的一部分且依赖于传统组件以提供其它所需的功能。作为其替代,或与其相结合,服务代理可被配置成通过应用程序和服务代理的实例外部的其它系统来处理至少一部分请求。
例如,一个服务代理函数可调用多个现有或传统的函数,或多个服务代理函数可调用同一传统组件。此外,如上所述,给定的服务代理函数甚至不需要访问现有的传统组件,而是选择自己处理调用。以这种方式,代理也可成为将代码从旧服务迁移至新服务应用程序的一种方式。
可以理解,上述服务代理提供优于现有机制的多个有利的特征,以向传统组件提供web服务。例如,现有技术要求客户机和服务器保持紧密耦合。这部分是由于客户机必须使用服务器实现的同一接口的这一事实。同样,对服务或其接口的任何修改也必须在web服务客户机上更新。
然而,通过本发明的服务代理机制,web服务客户机和由传统组件提供的服务是松散耦合的。从而,尽管服务代理对现有传统服务或传统组件是透明的,但所展示的代理接口是客户机可见的。客户机然后使用由服务代理展示的该代理接口来通信。因为web服务客户机是从服务的传统接口中抽象出来的,所以对提供服务的传统组件或其接口的任何修改不需要更新web服务客户机。尽管可能需要对服务代理进行某些调整以适应对应用程序的修改,但是与更新web服务客户机和/或重写相比较,这些修改仅是少量的。另外,这些少量调整是由开发员控制的,且对服务代理这样的修改也在开发员的技术水平和控制之内。
本发明的另一有利特征是接口的去耦。现有技术要求web服务接口上的方法调用的数量与传统或服务器接口上的方法调用的数量匹配。因为对用于创建web服务的元数据的使用创建了传统接口至web服务的文字转换,这样的文字转换(如上所述)可能不适于由传统组件提供的所有服务。
如前所述,本发明允许代理接口与传统接口不相关。从而,代理接口可含有与原始接口不同数量的方法调用,且服务代理方法调用可以按任何方式映射至现有方法。由此,开发员对web服务的互操作性、健壮性和效率有着更紧密的控制,而无需重写传统组件或传统接口。此外,如前所述,因为代理接口从用于与传统组件通信传统接口去耦,服务代理可成为将代码从传统服务迁移至新服务的一种方式。具体地,因为接口去耦,随着时间的推移,每一服务可逐渐从传统组件被迁移至服务代理。
本发明也方便地允许服务代理去耦。然而,现有技术要求接口的代理要与该接口的所有实例相关联。然而,本发明允许用作现有服务的服务代理仅被松散地耦合至该服务。在逐个服务基础上选取服务代理,这允许不同的服务具有不同的代理,即使这些服务可由相同的现有服务支持或实现同一接口。
图1B示出了上述本发明的各种示例实施例。如图所示,分布式系统100提供用于不仅生成动态web服务175(如上所述),还生成代理服务的实例116(此处被称为“代理实例”、“服务代理的实例”或“服务代理实例”)的机制。对该特定实施例,分布式系统100提供包含web服务初始化器180和配置文件155的web服务基础架构122。在对应用程序120(或通过其它实例)初始化后,web服务初始化器180可咨询配置文件155,并确定将为由应用程序125提供的一个或多个服务生成服务代理的实例116。该配置文件155可包含用于标识将使用的服务和服务代理两者的唯一标识符。当然,标识和定位这样的模块的其它方式也可用于本发明。
注意,尽管服务代理的实例116是在初始化应用程序125之后生成的,但存在初始化或生成服务代理实例116的其它方式。例如,如此处所述的服务代理实施例在上述静态方法中也能同等地工作。从而,除非明确地要求保护,否则使用web服务初始化器180在应用程序125初始化之后对服务代理实例116的初始化仅是用于说明性的目的,而不意味着限制或缩小本发明的范围。尽管如此,以上就用于初始化应用程序和代理实例116的动态web服务175所述的进程也在本实施例中可用。例如,可从请求140的接收或从来自用户在服务110处的输入对应用程序125和代理接口116进行初始化。
无论服务代理实例116是如何被初始化的,类似于上述组件元数据160来访问代理元数据104。代理元数据104描述用于与服务代理的实例116通信的服务代理和代理接口114(被称为“SIF”)。代理元数据104可从目录数据库102中访问,然后可被传递给服务基础架构122用于生成代理描述106。该服务描述又被传递给构建器108用于生成服务代理实例116和代理接口114。注意,尽管代理实例114和动态web服务175两者的构建器108被示为分开的组件,但这些构建器108也可以是单个模块。事实上,构建器108可以是web服务基础架构122的一部分,甚至是web服务初始化器180的一部分。从而,除非明确地要求保护,否则构建器108模块的位置仅用于方便和说明性的目的,而不意味着限制或缩小本发明的范围。
一旦生成了代理实例116和代理接口114,可从web服务客户机145接收对应于与之相关联的服务的请求140。当在web服务基础架构122接收到请求消息140时,该web服务基础架构可标识被定向给由服务代理控制的服务的那些请求140(或其部分)。这些请求140然后通过代理接口114被直接传递给代理实例116。就在此时,如前所述,取决于服务代理的配置,代理实例116可使用任何数量的进程来处理请求140。
例如,代理实例116可被配置成处理请求140,而无需对传统组件135进行任何调用或传递任何参数,从而将所有处理留给内部函数。或者,代理实例116可选择对所有请求140的至少一部分,对传统组件135进行调用并对其传递参数115。而且,代理实例116可调用该应用程序和代理实例116外部的其它系统112以处理请求140的任何一部分。另外,用于根据代理实例116处理请求的这些机制116、135、112的任何组合是在本发明的范围之内的,取决于自定义对象或服务代理的开发员配置。同样注意,尽管其它系统112被示为在服务110外部,但是情况可能并不如此。例如,其它系统112可以是服务110内的其它应用程序。从而,除非明确地要求保护,否则将其它系统112置于服务110外部仅是用于说明性的目的,而不意味着限制或缩小本发明的范围。
无论如何处理请求消息140,类似于动态web服务175,代理实例116和/或代理接口114应该了解该服务的消息交换模式以识别何时将从各个组件116、135、112接收返回值120。如果返回值120是消息交换模式的一部分,那么返回值120可以在响应消息130中格式化,并被发送给web服务客户机145。当然,取决于返回值的类型(例如,如果该返回值是简单的已接收请求OK),可以需要或不需要对客户机145的响应130。
注意,代理实例116位于代理接口114和用于与传统组件135通信的接口之间。如前所述,该有利特征允许将web服务客户机145与由应用程序125提供的现有服务松散地耦合。另外,代理接口114从用于与传统组件135通信的传统接口中去耦。这允许在传统组件135内修改,而不必升级客户机145,也提供用于从传统组件迁移至新服务的机制。然而注意,尽管代理接口114被示为分离的模块,但代理接口是代理实例116的整体部分;从而可被认为是代理实例116的一部分。
同样注意,对由不被代理服务支持的应用程序125提供的其它服务,web服务初始化器180也产生动态web服务175而不是服务代理实例116。从而,可期望工作良好的传统组件接口的文字转换使用动态web服务175来转置,其中调用和参数115如上所述被直接传递给传统组件135。从而,该分布式系统可为适当转换的传统组件的接口处理请求140;然而,在其它情况下不可操作或低效的服务可利用此处所述的服务代理进程。
也注意到,尽管图1A的传统客户机105未被示出,但是该代理服务实施例也提供对传统客户机105的支持。同样注意,在应用程序125终止之后,类似于如上所述的动态web服务175,可通过将代理描述106发送给回收站175来删除它,且代理服务实例116终止。从而,代理描述106、代理实例116和代理接口114将被关闭,使得在应用程序下一次初始化之后,将生成新代理描述106、新代理实例116和新代理接口114。
最后,注意到,尽管图1B以及图1A内的各种组件关于彼此被示为与web服务基础架构或其它模块分离,但示例性实施例不限于任何类型的配置或模块的布局。从而,图1B和1A内的模块的位置和配置仅用于说明性的目的,而不意味着限制或缩小本发明的范围。
作为对服务代理实施例的简要概述,服务代理被实现为对web服务基础架构122的两个挂钩。第一个挂钩是在服务或应用程序125启动过程中。如果服务代理被配置成用于服务,那么web服务基础架构122使用元数据104来构建用于构造将被展示给web服务客户机145的代理接口115的代理描述106。第二个挂钩是在代理实例116创建过程中,其中如果服务代理被配置,那么除创建现有应用程序125或服务的新实例以外,该基础架构也创建服务代理的新实例116。web服务基础架构122然后将其对传统服务或应用程序125的引用传递给服务代理实例116,且方法调用在服务代理而不是应用程序125上分派。
本发明也可按照包含功能性步骤和/或非功能性动作的方法来描述。以下是可在实现本发明时执行的步骤和/或动作的描述。通常,功能性步骤按照实现的结果来描述本发明,而非功能性动作描述用于获得特定结果的更具体动作。尽管可以按特定的顺序描述或要求保护功能性步骤和/或非功能性动作,但本发明不必限于步骤和/或动作的任何特定的顺序或组合。而且,对权利要求书以及图2和3的流程图的以下描述中所述的步骤和/或动作的使用被用于指示对这样的术语的所期望的特定使用。
图2和3示出了本发明的各个示例性实施例的流程图。对图2和3的以下描述将偶尔会参考来自图1A、和1B中的相应元素。尽管对来自这些附图的特定元素进行参考,但是除非明确地要求保护,否则这些元素仅被用于说明性的目的,而不意味着限制或缩小本发明的范围。
图2示出了通过由开发员为经由没有被开发成在web服务环境中通信的传统接口通信的传统组件创建的自定义对象来提供web服务的方法200的流程图。该自定义对象允许开发员更紧密地控制web服务的互操作性、健壮性和效率,而无需重写传统组件。方法200包括从web服务客户机接收访问由具有传统组件的应用程序提供的服务的请求的动作205。例如,可在web服务基础架构122处从web服务客户机145接收请求140以访问由具有传统组件135的应用程序125提供的服务,传统组件135使用没有被开发成在web服务环境中通信的传统接口来通信。
之后,方法200包括用于使用服务代理来处理该请求的步骤220。更具体地,步骤220包括标识该请求对应于由服务代理控制的服务的动作210。例如,当在web服务基础架构122处接收到请求140时,请求140可被标识为对应于服务代理,后者是由开发员创建的将代理接口114展示为web服务客户机145与传统接口之间的抽象的自定义对象。
步骤220还包括将至少一部分请求经由代理接口传递给服务代理实例的动作215。例如,web服务基础架构122在接收到请求140之后,可将至少一部分请求140通过代理接口114传递给服务代理实例116以供进一步处理。服务代理实例116可被配置成通过对一个或多个传统组件的调用、对服务代理实例116的调用或对该应用程序和该服务代理外部的其它系统112的调用中的一个或多个来处理至少一部分请求。
注意,服务代理实例116可在初始化应用程序125之后生成。在这样的情况中,以上方法也可包括接收停止应用程序125的请求的动作。基于该停止应用程序125的请求,服务代理实例116也可以被自动停止。而且,服务代理描述106也可被删除,使得新的服务代理实例116和新的服务代理描述106将在应用程序125的下一次初始化之后生成。
无论在何时生成服务代理实例116,代理描述106可用于生成代理服务实例116和代理接口114,其中代理描述106描述以下的一个或多个调用操作;参数;或用于与一个或多个传统组件135、服务代理实例116或应用程序125和服务代理实例116外部的其它系统112通信的消息交换模式。
当根据代理元数据104,基于代理描述106创建代理接口114时,以上方法还可包括以下动作。基于代理描述106,可为要求对web服务客户机145的响应的传统组件135之一标识消息交换模式。同样,可从一个或多个传统组件、服务代理实例116或应用程序125和服务代理实例116外部的其它系统112中的一个或多个接收一个或多个返回值120。之后,服务代理实例116可用于将该一个或多个返回值120格式化成响应130,然后将响应发送给web服务客户机145以供进一步处理。
还注意,服务代理或其实例116可结合动态web服务175使用,使得由传统组件135提供的应用程序125的其它服务可利用如此处所述的动态web服务175。在这样的情况中,如所述在组件元数据160内的传统接口的接口描述可用于为由具有一个或多个传统组件135的应用程序125提供的另一服务生成动态web服务175。可在应用程序125初始化时生成动态web服务175,其中动态web服务175是传统接口的文字转换。在这种情况中,可通过另一服务器接收到相应的另一服务请求消息140。web服务请求消息140可包含一个或多个参数和用于请求由一个或多个传统组件135提供的服务的一个或多个操作。之后,动态web服务175用于对该一个或多个传统组件135作出一个或多个传统调用115。该一个或多个参数115然后可被传递给该一个或多个传统组件135以供进一步处理。
在其它示例性实施例中,基于传统接口描述,可为一个或多个传统组件135标识消息交换模式,使得需要对web服务客户机145的响应130。在这种情况中,可从该一个或多个传统组件135接收一个或多个返回值120,其中动态web服务175用于将该返回值120格式化成web服务响应消息130。之后,该web服务响应消息130被发送给web服务客户机145以供进一步处理。
图3示出了用于提供由开发员为经由没有被开发成在web服务环境中通信的传统接口通信的一个或多个传统组件创建的自定义对象的初始化的方法300的流程图。方法300包括接收初始化应用程序的请求的动作305。例如,服务110可接收初始化应用程序125的请求,应用程序125包含用于提供服务的传统组件135。传统组件135使用没有被开发成在web服务环境中通信的传统接口通信。初始化应用程序的请求可响应于来自web服务客户机145的服务请求消息140而接收。或者,初始化应用程序125的请求可响应于来自服务110计算设备处的用户界面的输入而接收。
基于该初始化应用程序的请求,方法300也包含用于生成服务代理实例的步骤325。具体地,步骤325包括标识将生成服务代理实例的动作310。例如,在初始化应用程序125之后,web服务初始化器180可咨询配置文件155,它包含例如唯一标识符和用于指示将在初始化应用程序125之后生成服务代理实例116的其它信息。服务代理是由开发员创建的将代理接口114展示为web服务客户机145与传统接口之间的抽象的自定义对象。步骤325也包括访问描述代理接口的元数据的动作315。例如,可从目录数据库102访问描述将被展示给web服务客户机145的代理接口114的代理元数据104。
之后,步骤325包括使用元数据生成包含该代理接口的服务代理实例的动作320。具体地,web服务初始化器180可使用代理元数据104来生成包含该代理接口114的服务代理实例116。服务代理实例116被配置成通过对一个或多个传统组件135的调用、对服务代理实例116的调用或对应用程序125和服务代理实例116外部的其它系统的调用中的一个或多个来处理来自web服务客户机145的请求140的至少一部分。
代理元数据也可用于首先生成代理描述106,然后使用代理描述106来生成服务代理实例116和代理接口114。代理描述106描述以下的一个或多个调用操作;参数;或用于与一个或多个传统组件135、服务代理实例116或应用程序125和服务代理实例116外部的其它系统112通信的消息交换模式。代理描述106可以是WSDL文档。
此外,基于代理描述106,可标识用于一个或多个传统组件135的消息交换模式需要对web服务客户机145的响应130。之后,可从一个或多个传统组件135、服务代理实例116或应用程序125和服务实例116外部的其它系统112中的一个或多个接收一个或多个返回值120。服务代理实例116可用于将该一个或多个返回值120格式化成web服务响应消息130。web服务响应消息130然后可被发送给web服务客户机145以供进一步处理。
在其它示例性实施例中,动态web服务175可结合代理实例116一起运行。在该实施例中,来自组件元数据160的接口描述用于为由具有传统组件135的应用程序125提供的另一服务生成动态web服务175。在应用程序125初始化时生成的动态web服务175是传统接口的文字转换。在该实施例中,可接收对应于另一服务的另一服务请求消息140。web服务请求消息140可包含一个或多个参数(如果有),和用于请求由一个或多个传统组件135提供的服务的一个或多个操作。动态web服务175然后用于对传统组件135作出一个或多个传统调用115。参数115然后可被传递给传统组件135中的一个或多个以供进一步处理。
同样在以上示例性实施例中,基于来自组件元数据160的传统接口描述,为传统组件135标识消息交换模式,该模式要求对web服务客户机145的响应130。之后,可从传统组件135接收一个或多个返回值120,其中动态web服务175用于将该返回值120格式化成web服务响应消息130。web服务响应消息130然后可被发送给web服务客户机145以供进一步处理。web服务请求消息140和web服务响应130以及此处所述的其它文档都可以是XML文档。
在动态web服务175和代理实例116均同步运行的情况中,其它示例性实施例允许在服务代理实例116和动态web服务器175自动停止或终止之后接收停止应用程序125的请求。而且,删除代理描述106和web服务描述150,使得将在应用程序125下一次初始化之后,生成新服务代理实例116、新动态web服务175、新代理描述106和新web服务描述150。
本发明范围内的实施例也包括用于携带或其上存储计算机可执行指令或数据结构的计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机访问的任何可用介质。作为示例,而非限制,这样的计算机可读介质可包括RAM、ROM、EPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁性存储设备,或可被用于以计算机可执行指令或数据结构的形式携带或存储所期望的程序代码装置且可由通用或专用计算机访问的任何其它介质。当通过网络或另一通信连接(或是硬连线、无线或是硬连线或无线的组合)将信息传送或提供给计算机时,该计算机恰当地将该连接视为计算机可读介质。因此,任何这样的连接被恰当地称为计算机可读介质。以上的组合也应包含在计算机可读介质的范围内。计算机可执行指令包括,例如,使得通用计算机、专用计算机或专用处理设备执行特定的一个或一组功能的指令和数据。
图4及以下描述旨在提供可在其中实现本发明的合适的计算环境的简要概括描述。尽管不是必需的,但本发明将在诸如程序模块等由网络环境中的计算机执行的计算机可执行指令的通用语境中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等,它们执行特定任务或实现特定抽象数据类型。计算机可执行指令、相关联的数据结构和程序模块表示用于执行此处所揭示的方法的步骤的程序代码装置的示例。这样的可执行指令或相关联数据结构的特定顺序表示用于实现在这些步骤中所述的功能的相应动作的示例。
本领域的技术人员可以理解,本发明可以在具有多种类型的计算机系统配置的网络计算环境中实现,这些计算机系统配置包括个人计算机、手持式设备、多处理器系统、基于微处理器或可编程消费者电子产品、网络PC、小型机、大型计算机等。本发明也可以在分布式计算环境中实现,其中任务由通过通信网络连接(或者通过硬连线、无线链路或通过硬连线或无线链路的组合)的本地和远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。
参考图4,用于实现本发明的示例系统包括常规计算机420形式的通用计算设备,包含处理单元421、系统存储器422和将包括系统存储器422在内的各种系统组件耦合至处理单元421的系统总线423。系统总线423可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线和使用各种总线体系结构中的任一种的局部总线。系统存储器包括只读存储器(ROM)424和随机存取存储器(RAM)425。基本输入/输出系统(BIOS)424包含有助于诸如启动时在计算机420中元件之间传递信息的基本例程,它可被存储在ROM 424中。
计算机420还可以包括用于从磁硬盘439中读取或向其写入的磁硬盘驱动器427,用于从可移动磁盘429中读取或向其写入的磁盘驱动器428,以及用于从诸如CD ROM或其它光学介质等可移动光盘431中读取或向其写入的光盘驱动器430。磁硬盘驱动器427、磁盘驱动器428和光盘驱动器430分别由硬盘驱动器接口432、磁盘驱动器接口433和光盘驱动器接口434连接至系统总线423。驱动器及其相关联的计算机可读介质为计算机420提供了对计算机可执行指令、数据结构、程序模块和其它数据的非易失性存储。尽管此处所示的示例性环境使用磁硬盘439、可移动磁盘429和可移动光盘431,也可以使用用于存储数据的其它类型的计算机可读介质,包括盒式磁带、闪存卡、数字多功能盘、贝努利盒式磁盘、RAM、ROM等。
可以在硬盘439、磁盘429、光盘431、ROM 424或RAM 425上存储包括一个或多个程序模块的程序代码装置,包括操作系统435、一个或多个应用程序模块436、其它程序模块437和程序数据438。用户可以通过键盘440和定点设备442,或诸如麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等其它输入设备(未示出)向计算机420输入命令和信息。这些和其它输入设备通常由耦合至系统总线423的串行端口接口446连接至处理单元421。或者,输入设备可以由诸如并行端口、游戏端口或通用串行总线(USB)等其它接口连接。监视器447或另一显示设备也经由诸如视频适配器448等接口连接至系统总线423。除监视器之外,个人计算机一般包括其它外围输出设备(未示出),诸如扬声器和打印机。
计算机420可使用至一台或多台远程计算机,诸如远程计算机449a和449b的逻辑连接在网络化环境中操作。远程计算机449a和449b各自可以是另一台个人计算机、服务器、路由器、网络PC、对等设备或其它常见网络节点,且通常包括上文相对于计算机420描述的许多或所有元件,尽管在图4中只示出存储器存储设备450a和450b以及其相关联的应用程序436a和436b。图4中所示逻辑连接包括此处作为示例而非限制示出的局域网(LAN)451和广域网(WAN)452。这样的网络环境在办公室范围或企业范围计算机网络、内联网和因特网中是常见的。
当在LAN网络环境中使用时,计算机420通过网络接口或适配器453连接至局域网451。当在WAN网络环境中使用时,计算机420通常包括调制解调器454、无线链路或用于通过诸如因特网等广域网452建立通信的其它装置。调制解调器454可以是内置或外置的,它通过串行端口接口446连接至系统总线423。在网络化环境中,相对于计算机420所描述的程序模块或其部分可以存储在远程存储器存储设备中。可以理解,所示的网络连接是示例性的,且可以使用通过广域网452建立通信链路的其它手段。
本发明可以用其它具体形式来实施,而不背离其精神或本质特征。所述的实施例在所有方面都被认为仅是说明性的而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述来指示。落入本发明权利要求书的等效技术方案的意义和范围内的所有变化都被包括在其范围内。
权利要求
1.一种在分布式系统的服务计算设备处的方法,所述方法通过由开发员为经由未被开发成在web服务环境中通信的传统接口通信的传统组件创建的自定义对象来提供web服务,所述自定义对象允许开发员更紧密地控制web服务的互操作性、健壮性和效率,而无需重写传统组件,所述方法包括以下动作从web服务接收对访问由具有一个或多个传统组件的应用程序提供的服务的请求,所述传统组件使用未被开发成在web服务环境中通信的传统接口来通信;标识所述请求对应于由服务代理控制的服务,所述服务代理是由开发员创建的将代理接口展示为所述web服务客户机和所述传统接口之间的抽象的自定义对象;以及通过所述代理接口将所述请求的至少一部分传递给所述服务代理的实例以供进一步处理,所述服务代理的实例被配置成通过对所述一个或多个传统组件的调用、对所述服务代理实例的调用或对所述应用程序和所述服务代理实例外部的其它系统的调用中的一个或多个来处理所述请求的至少一部分。
2.如权利要求1所述的方法,其特征在于,所述服务代理是在初始化所述应用程序的请求之后生成的。
3.如权利要求2所述的方法,其特征在于,使用代理描述来生成所述服务代理实例和所述代理接口,其中,所述代理描述描述了以下的一个或多个调用操作;参数;或用于与所述一个或多个传统组件、所述服务代理实例或所述应用程序和服务代理实例外部的其它系统通信的消息交换模式。
4.如权利要求3所述的方法,其特征在于,还包括以下动作接收停止所述应用程序的请求;基于停止所述应用程序的请求,自动停止所述服务代理实例;以及删除所述代理描述,使得在所述应用程序的下一次初始化之后,将生成所述服务代理的新的实例和新的代理描述。
5.如权利要求1所述的方法,其特征在于,所述代理接口是基于代理描述创建的,所述方法还包括以下步骤基于所述代理描述,标识用于所述一个或多个传统组件的消息交换模式需要对所述web服务客户机的响应;从所述一个或多个传统组件、所述服务代理实例或所述应用程序和服务代理实例外部的其它系统中的一个或多个接收一个或多个返回值;使用所述服务代理实例将所述一个或多个返回值格式化成web服务响应消息;以及将所述web服务响应消息发送给所述web服务客户机以供进一步处理。
6.如权利要求1所述的方法,其特征在于,基于所述传统接口的接口描述,为由具有所述一个或多个传统组件的应用程序提供的另一服务生成动态web服务,所述动态web服务是在所述应用程序初始化时生成的,且其中,所述动态web服务是对所述传统接口的文字转换,所述方法还包括以下动作接收对应于所述另一服务的另一服务请求消息,所述web服务请求消息包括一个或多个参数,和用于请求由所述一个或多个传统组件提供的服务的一个或多个操作;使用所述动态web服务对所述一个或多个传统组件作出一个或多个调用;以及将所述零个或多个参数传递给所述一个或多个传统组件中的一个或多个以供进一步处理。
7.如权利要求6所述的方法,其特征在于,还包括以下动作基于所述动态传统接口描述,标识用于所述一个或多个传统组件的消息交换模式要求对所述web服务客户机的响应;从所述一个或多个传统组件接收一个或多个返回值;使用所述web服务将所述返回值格式化成web服务响应消息;以及将所述web服务响应消息发送给所述web服务客户机以供进一步处理。
8.一种在分布式系统的服务计算设备处的方法,所述方法初始化由开发员为经由未被开发成在web服务环境中通信的传统接口通信的一个或多个传统组件创建的自定义对象,所述自定义对象允许开发员更紧密地控制web服务的互操作性、健壮性和效率,而无需重写一个或多个传统组件,所述方法包括以下动作接收初始化应用程序的请求,所述应用程序包含用于提供服务的一个或多个传统组件,其中所述一个或多个传统组件使用未被开发成在web服务环境中通信的传统接口通信;基于所述初始化应用程序的请求,标识将要生成服务代理实例,所述服务代理是由开发员创建的将代理接口展示为web服务客户机与所述传统接口之间的抽象的自定义对象;访问描述将被展示给所述web服务客户机的代理接口的元数据;以及使用所述元数据生成包含所述代理接口的服务代理的实例,其中所述服务代理实例被配置成通过对所述一个或多个传统组件的调用、对所述服务代理实例的调用或对所述应用程序和所述服务代理实例外部的其它系统的调用中的一个或多个处理来自所述web服务客户机的请求的至少一部分。
9.如权利要求8所述的方法,其特征在于,所述初始化应用程序的请求是响应于来自所述web服务客户机的服务请求消息而接收的。
10.如权利要求8所述的方法,其特征在于,所述初始化应用程序的请求是响应于来自服务计算设备处的用户界面的输入而接收的。
11.如权利要求8所述的方法,其特征在于,所述元数据用于首先生成代理描述,所述代理描述然后用于生成所述服务代理实例和所述代理接口。
12.如权利要求11所述的方法,其特征在于,所述代理描述描述了以下的一个或多个调用操作;参数;或用于与所述一个或多个传统组件、所述服务代理实例或所述应用程序和服务代理实例外部的其它系统通信的消息交换模式。
13.如权利要求11所述的方法,其特征在于,所述代理描述是WSDL文档。
14.如权利要求11所述的方法,其特征在于,还包括以下动作基于所述代理描述,标识用于所述一个或多个传统组件的消息交换模式要求对所述web服务客户机的响应;从所述一个或多个传统组件、所述服务代理实例或所述应用程序和服务代理实例外部的其它系统中的一个或多个接收一个或多个返回值;使用所述服务代理实例将所述一个或多个返回值格式化成web服务响应消息;以及将所述web服务响应消息发送给所述web服务客户机以供进一步处理。
15.如权利要求11所述的方法,其特征在于,基于所述传统接口的接口描述,为由具有所述一个或多个传统组件的应用程序提供的另一服务生成动态web服务,所述动态web服务在所述应用程序的初始化时生成,且其中,所述动态web服务是对所述传统接口的文字转换,所述方法还包括以下动作接收对应于所述另一服务的另一服务请求消息,所述另一服务请求消息包括用于请求由所述一个或多个传统组件提供的另一服务的一个或多个操作;以及基于所述一个或多个操作,使用所述动态web服务对所述一个或多个传统组件作出一个或多个调用。
16.如权利要求15所述的方法,其特征在于,所述web服务请求消息还包括一个或多个参数,所述方法还包括以下动作将所述一个或多个参数传递给所述一个或多个传统组件中的一个或多个以供进一步处理。
17.如权利要求16所述的方法,其特征在于,还包括以下动作基于所述传统接口描述,标识用于所述一个或多个传统组件的消息交换模式要求对所述web服务客户机的响应;从所述一个或多个传统组件接收一个或多个返回值;使用所述动态web服务将所述返回值格式化成web服务响应消息;以及将所述web服务响应消息发送给所述web服务客户机以供进一步处理。
18.如权利要求17所述的方法,其特征在于,还包括以下动作接收停止所述应用程序的请求;基于停止所述应用程序的请求,自动停止所述服务代理实例和所述动态web服务;以及删除所述代理描述和所述web服务描述,使得在所述应用程序的下一次初始化之后,将生成所述服务代理的新的实例、新的动态web服务、新的代理描述和新的web服务描述。
19.如权利要求8所述的方法,其特征在于,还包括以下动作接收停止所述应用程序的请求;基于停止所述应用程序的请求,自动停止所述服务代理实例;以及删除所述代理描述,使得在所述应用程序的下一次初始化之后,将生成所述服务代理的新的实例和新的代理描述。
20.一种在分布式系统的服务计算设备处的计算机程序产品,所述计算机程序产品用于实现一种方法,所述方法初始化由开发员为经由未被开发成在web服务环境中通信的传统接口通信的一个或多个传统组件创建的自定义对象,所述自定义对象允许开发员更紧密地控制web服务的互操作性、健壮性和效率,而无需重写一个或多个传统组件,所述计算机程序产品包含其上存储计算机可执行指令的一个或多个计算机可读介质,当所述计算机可执行指令由处理器执行时,可使得所述分布式计算系统执行以下动作接收初始化应用程序的请求,所述应用程序包含用于提供服务的一个或多个传统组件,其中所述一个或多个传统组件使用未被开发成在web服务环境中通信的传统接口通信;基于所述初始化应用程序的请求,标识将要生成服务代理实例,所述服务代理是由开发员创建的将代理接口展示为web服务客户机与所述传统接口之间的抽象的自定义对象;访问描述将被展示给所述web服务客户机的代理接口的元数据;以及使用所述元数据生成包含所述代理接口的所述服务代理的实例,其中所述服务代理实例被配置成通过对所述一个或多个传统组件的调用、对所述服务代理实例的调用或对所述应用程序和所述服务代理实例外部的其它系统的调用中的一个或多个来处理来自所述web服务客户机的请求的至少一部分。
全文摘要
本发明的示例实施例提供用于允许开发员定义新接口并插入为在其它情况下不能在web服务环境中通信的传统组件实现这些新接口的自定义转换代码。这些新接口然后可以按照从传统组件接口中提取web服务客户机的方式被展示给web服务客户机。实现该新接口的对象在此处被称为“服务代理”,新接口将通常被称为“代理接口”。这些代理接口可以连同服务代理实例在提供服务的应用程序启动之后被初始化。另外,对可能无需由服务代理提供的特征的那些服务,动态web服务可与服务代理同步运行。
文档编号H04L29/06GK1832476SQ20061000379
公开日2006年9月13日 申请日期2006年2月10日 优先权日2005年3月8日
发明者A·D·米利根, H·赛德, J·D·多荻, M·A·菲恩古尔德, S·阿布拉汉 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1