避免混淆数据集合和Web服务

日期: 2008-01-06 作者:Paul Ballard 来源:TechTarget中国 英文

Microsoft .NET架构使得开发者可以使用Web服务快速的构建松耦合的系统。除了Web服务,.NET架构还提供了其他的好处给开发者。也学在.NET架构中的最重要的类集之一就是ADO.NET。通过ADO.NET,开发者可以比原来更加轻松的有效处理分离的数据。

它也允许数据来维护关联和参考内容的整体性。   所以可以很自然地看到,一个同一个数据库协作的.NET Web服务想要利用ADO.NET的在处理分离数据特征上面的优势,特别是DataSet类。许多的.NET Web服务演示已经完成了这些,创造了一个可以返回一个被某种UI使用的数据集的Web 服务,这个服务也是用.NET开发的,它可以十分……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

Microsoft .NET架构使得开发者可以使用Web服务快速的构建松耦合的系统。除了Web服务,.NET架构还提供了其他的好处给开发者。也学在.NET架构中的最重要的类集之一就是ADO.NET。通过ADO.NET,开发者可以比原来更加轻松的有效处理分离的数据。它也允许数据来维护关联和参考内容的整体性。

  所以可以很自然地看到,一个同一个数据库协作的.NET Web服务想要利用ADO.NET的在处理分离数据特征上面的优势,特别是DataSet类。许多的.NET Web服务演示已经完成了这些,创造了一个可以返回一个被某种UI使用的数据集的Web 服务,这个服务也是用.NET开发的,它可以十分容易的把数据和控制邦定。

      <s:element name="GetCustomersResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetCustomersResult">
              <s:complexType>
                <s:sequence>
                  <s:element ref="s:schema" />
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>

  为了衡量整个的解决方案,开发者需要明白的是Web服务是有意要去创造功能的不可知的技术集合——对任何的客户,使用任何的技术,都可以使用在那个服务中包含的特征。为此成为一个好的Web服务,它应该可以为其它的技术使用。让我们看看一个能够返回数据集的简单的Web服务的细节,同时看看它是如何符合标准的。

  在创建了一个简单的可以返回数据集的Web方法之后,看看由.NET架构生成的WSDL(Web 服务描述语言)。记住WSDL描述了这个服务,包括方法的名字,参数和返回值。这个数据会被.NET 架构的WSDL.exe工具使用,同其他技术的工具一起来创建一个为客户访问服务时使用的端口类。。这种类型的一个细节性的描述被当成参数和返回值来使用,这对产生一个有用的端口类是必要的。

  下面是一个简单的Web服务的WSDL中的一个摘要,它显示了GetCustomers Web方法的返回值。注意到GetCustomersResult实际上是有两种类型来组成的——第一种是一个XML模式,第二种是一个类型。当这个方法被执行,它将会返回一个模式来描述结果,同时这个结果本身就可能是任何的类型。这就是WSDL等效的后邦定。

  第一个问题是任何的试图为服务产生一个端口的工具根本没办法知道应该期待什么。类型确认将会在运行时被执行。

  那么.NET架构是如何知道什么时候应该把结果转化为客户端口的数据集?关键是在于调用产生的实际的XML 。下面是一个在Web方法被调用并且只有一行被返回的时候返回的XML的一个子集

  <DataSet >http://tempuri.org/BadWS/Service1">
  <xs:schema id="NewDataSet" >http://www.w3.org/2001/XMLSchema"
    xmlns_msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata_IsDataSet="true">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="Table1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="FirstName" type="xs:string" minOccurs="0" />
                <xs:element name="LastName" type="xs:string" minOccurs="0" />
                <xs:element name="Age" type="xs:int" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns_msdata="urn:schemas-microsoft-com:xml-msdata"
    xmlns_diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
      <Table1 diffgr_id="Table11" msdata_rowOrder="0"
     diffgr_hasChanges="inserted">
        <FirstName>Paul</FirstName>
        <LastName>Ballard</LastName>
        <Age>32</Age>
      </Table1>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

  模式定义再表中有三个列是由他们的类型来定义的,但是请注意粗体字部分。模式的规范包括一个微软的具体的命名空间,还有一个来自称之为"IsDataSet"的命名空间的属性设置为真——输入的数据实际上是一个ADO.NET数据集。

  所以一个对ADO.NET数据集没有概念的基于java的客户程序需要直接的同数据协作,例如XML。当那不一起排除互操作性同时,这就使得在最后的结果只是一个在三个领域的客户列表的时候,情况更加困难了。

  通过首先使用数据集和使用一列自定义类型来替代,Web服务可以具有更加有用和更好的互操作性。下面是一个使用自定义类型创造的Web服务 的WSDL的摘要。

      <s:element name="GetCustomers2Response">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetCustomers2Result"
     type="tns:ArrayOfCustomer" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfCustomer">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="Customer"
      type="tns:Customer" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="Customer">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="FirstName"
      type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="LastName"
      type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="Age"
      type="s:int" />
        </s:sequence>
      </s:complexType>

  注意到它把GetCustomers2Result定义为一列复杂类型,该复杂类型具有每个领域的明确定义。现在,即使一个基于java的工具都可以产生一个有用的端口,从而可以允许客户开发者能够更加方便的使用我们的服务。

相关推荐