我们正在使用.Net 2.0来创建Web服务。我们想在ASP.Net 2.0中设计webservices。
目前,我们已经返回了一个像
这样的单个参数的web服务 <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>
我们还设计了返回类似
模型的Web服务 <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>
目前的做法是,如果任何操作失败,如身份验证失败,我们会从Web服务中抛出异常。
我们想知道哪种是设计Web服务的最佳方法,因此可以在各种平台上使用它而不会出现技术问题。
会使用json帮助。返回纯XML会有所帮助。
答案 0 :(得分:0)
通常,您应该从ASMX Web服务中抛出SoapException
以指示失败。这会将SOAP Fault消息返回给客户端。
但是,ASMX Web服务没有对SOAP Faults的适当支持。生成的WSDL不会向您的客户表明您的操作可以返回错误。这将阻止某些客户端正确处理这些故障。
所以,你应该真正转向WCF,这解决了这个问题。如果必须继续使用.NET 2.0,那么您的替代方法是不使用SoapException
,或创建自己的WSDL,这应该正确描述操作返回的错误。