不要混淆DataSets和Web services

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

Microsoft .NET构架已经允许开发者通过使用Web services迅速构建松耦合系统。除了Web services,.NET构架还为开发者提供了其他的一些好处。也许在.NET构架中的最重要的一个类集是ADO.NET。通过使用ADO.NET,开发者可以显著地比以前更容易的使用分割开的数据。

这也同样的允许了数据来保持关系和参考性的完整性。   所以当一个和数据库交互的 a .NET Web service想要利用ADO.NET中的分离得数据特性,并且特别是数据集类的特性时,这一切看起来是那么的自然。许多.NET Web service演示模型已经仅仅完成了这些,这些模型创建了一个Web……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

Microsoft .NET构架已经允许开发者通过使用Web services迅速构建松耦合系统。除了Web services,.NET构架还为开发者提供了其他的一些好处。也许在.NET构架中的最重要的一个类集是ADO.NET。通过使用ADO.NET,开发者可以显著地比以前更容易的使用分割开的数据。这也同样的允许了数据来保持关系和参考性的完整性。

  所以当一个和数据库交互的 a .NET Web service想要利用ADO.NET中的分离得数据特性,并且特别是数据集类的特性时,这一切看起来是那么的自然。许多.NET Web service演示模型已经仅仅完成了这些,这些模型创建了一个Web service,改Web service可以为用户接口或类似的软件返回所需的一个DataSet。用户接口或类似的软件是用.NET开发的,他们能够容易的邦定数据到特定的操作。

  为了整体的衡量解决方案,开发者需要理解的是,Web services是特意创建技术上的未知领域的功能——任何的客户端,使用任何的技术,能够重用包含在该服务中的特征。为了能够成为一个“好”的Web service,一个Web service应该被其他的技术所使用。让我们看一个简单的Web service的细节。该Web service返回了一个数据集。我们看看它是如何符合标准的。

  在创建了一个返回数据集的简单Web方法之后,我们看看它的为.NET构架生成的 WSDL (Web Services描述语言)。请记住WSDL描述了服务,包括服务的方法名称,参数和返回值。这些数据是被.NET构架中的WSD L.exe工具使用,而在其他的技术中可能被其他的工具所使用,这是为了能给客户端创建代理类,而客户端使用代理类来访问服务。把细致描述的类型使用来作为参数和返回值,这对于产生一个有用的代理类是必要的。

  下面是从一个简单的Web service的WSDL中的摘录,表示的是称为GetCustomers的WebMethod的返回值。请注意GetCustomersResult实际上是由两种类型组成的——一种是XML模式,第二种是类型。当该方法执行时,它将会返回一个描述结果的模式,并且结果本身可以使任何类型。这就是WSDL等同于后面的邦定。

  <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>

  第一个问题是任何试图为这个服务生成一个代理的工具无法知道需要些什么。类型检查将会在运行时被完成。

  所以.NET构架如何知道什么时候把结果转化为一个客户端的DataSet 关键是在于实际的XML是由调用产生的。下面是一个XML文档的一部分,这部分内容是在当WebMethod被调用并且只有一行被返回的时候返回的结果。

 <DataSet http://tempuri.org/BadWS/Service1">http://tempuri.org/BadWS/Service1">
  <xs:schema id="NewDataSet"  http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"
    >
    <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
    >
    <NewDataSet >
      <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数据集。

  所以一个基于java 的客户程序如果不知道ADO.NET数据集,就只有ho通过使用严格的数据格式,例如XML。当这种方式不排除互操作性的同时,这种方式使得当最终的结果只是一个具有三个域的客户列表的时候情况会更加困难。

  通过前述数据集的使用并使用一个客户类型的列表来替代, Web service就能更为显著地有用和可互操作。下面就是一个使用客户类型创建的Web service 的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的工具都可以生成一个可以允许客户开发者更加容易的来使用我们的服务的代理。

相关推荐