代码之家  ›  专栏  ›  技术社区  ›  Kalpak

开发一个新的应用程序的最佳方法是什么asp.net具有返回列表、单个对象或其他复杂数据类型的方法的Webservice

  •  -1
  • Kalpak  · 技术社区  · 16 年前

    目前,我们使用的webservices要么返回单个参数,比如

      <s:element name="ChangePassword">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="currentPassword" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="newPassword" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="ChangePasswordResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="ChangePasswordResult" type="s:boolean" />
          </s:sequence>
        </s:complexType>
      </s:element>
    

    我们还设计了返回如下模型的webservices

      <s:element name="GetCreditBalance">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetCreditBalanceResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetCreditBalanceResult" type="tns:UserCreditsModel" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="UserCreditsModel">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="CreditBalance" type="s:decimal" />
          <s:element minOccurs="1" maxOccurs="1" name="ValidityDate" type="s:dateTime" />
        </s:sequence>
      </s:complexType>
    

    我们还设计了返回模型列表的webservices,如

      <s:element name="GetHistory">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetHistoryResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetHistoryResult" type="tns:ArrayOfSMSCreditHistoryModel" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfSMSCreditHistoryModel">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="SMSCreditHistoryModel" nillable="true" type="tns:SMSCreditHistoryModel" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="SMSCreditHistoryModel">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="CreditHistoryId" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="PaymentDate" type="s:dateTime" />
          <s:element minOccurs="0" maxOccurs="1" name="PaymentRefNo" type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="TotalAmount" type="s:decimal" />
          <s:element minOccurs="1" maxOccurs="1" name="CreditsEarned" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="ValidityDate" type="s:dateTime" />
          <s:element minOccurs="0" maxOccurs="1" name="Mode" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Status" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ChequeNO" type="s:string" />
          <s:element minOccurs="1" maxOccurs="1" name="ChequeDate" type="s:dateTime" />
          <s:element minOccurs="0" maxOccurs="1" name="ChequeBankName" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Remarks" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ValidityDateTime" type="s:string" />
        </s:sequence>
      </s:complexType>
    

    当前的方法是,如果在任何操作失败(如身份验证失败)时,我们从webservice抛出一个异常。

    我们想知道哪种方法是设计Web服务的最佳方法,这样它就可以跨各种平台使用,而不会出现技术问题。

    使用json会有帮助。返回纯XML会有所帮助。

    1 回复  |  直到 15 年前
        1
  •  0
  •   John Saunders    16 年前

    一般来说,你应该扔一个 SoapException

    但是,asmxweb服务对SOAP错误没有适当的支持。生成的WSDL不会向您的客户机指示您的操作可能返回错误。这将阻止某些客户端正确处理这些故障。

    所以,你真的应该转到WCF,它解决了这个问题。如果您必须继续使用.NET2.0,您的替代方法是不使用.NET2.0 ,或者创建自己的WSDL,它应该正确地描述从操作返回的错误。