2010-09-21 115 views
2

我在VB.Net中使用返回自定義類或對象的方法創建了webservice。從傳統ASP使用SOAP客戶端3.0消費ASMX Webservice

<WebMethod()> _ 
Public Function CreatePerson(ByVal LastName As String, ByVal FirstName As String) As Person 
    Return New Person(LastName, FirstName) 
End Function 

Public Class Person 

    Public Sub New() 

    End Sub 

    Public Sub New(ByVal LastName As String, ByVal FirstName As String) 
     _LastName = LastName 
     _FirstName = FirstName 
    End Sub 

    Private _LastName As String 
    Public Property LastName() As String 
     Get 
      Return _LastName 
     End Get 
     Set(ByVal value As String) 
      _LastName = value 
     End Set 
    End Property 

    Private _FirstName As String 
    Public Property FirstName() As String 
     Get 
      Return _FirstName 
     End Get 
     Set(ByVal value As String) 
      _FirstName= value 
     End Set 
    End Property 

End Class 

我可以從另一個ASP.NET應用程序中使用它,但問題是當我嘗試通過SOAP客戶從傳統的ASP消耗它3.0

<% 

Dim Result, oSoapClient 

Set oSoapClient = Server.CreateObject("MSSOAP.SoapClient30") 

oSoapClient.ClientProperty("ServerHTTPRequest") = True 

Call oSoapClient.mssoapinit ("http://MyServer/MyWebService/MyWebService.asmx?WSDL") 

Result = oSoapClient.CreatePerson("Sassaroli", "Rinaldo") 

Response.Write(Result.LastName) 

%> 

我得到一個錯誤:

Microsoft VBScript運行時錯誤'800a01a8'

需要的對象

在「Response.Write(Result.LastName)」行。

我可以看到的結果是一個字符串數組,沒有元素

+0

只是瘋狂的猜測,在'Person'上砸了一個' _'屬性。 – 2010-09-21 17:27:01

+0

嗨亨克,我試過了,但得到同樣的錯誤。謝謝你的回答。 – 2010-09-21 19:56:05

回答

1

相信錯誤的根本原因是缺乏上調用該web服務方法的行一個Set關鍵字。它應該看起來像:

Set Result = oSoapClient.CreatePerson("Sassaroli", "Rinaldo") 

這會讓你過去最初的問題。之後,您需要閱讀結果對象。您的後續代碼行:

Response.Write(Result.LastName) 

很可能會導致另一個錯誤。這是因爲你得到的結果不是真正的「Person」對象,而是該對象的XML表示。您可以使用以下代碼驗證它:

<% 
    Dim Result, oSoapClient 

    Set oSoapClient = Server.CreateObject("MSSOAP.SoapClient30") 
    oSoapClient.ClientProperty("ServerHTTPRequest") = True 

    Call oSoapClient.mssoapinit ("http://MyServer/MyWebService/MyWebService.asmx?WSDL") 

    Set Result = oSoapClient.CreatePerson("Sassaroli", "Rinaldo") 

    Response.Write(TypeName(Result) & "<br/>" & vbCrLf) 

    Response.Write(Result.item(0).text) 
%> 

TypeName調用將顯示的類型爲IXMLDomSelection。您可以通過here中記錄的方法和屬性訪問此對象的節點。

最後一行代碼將顯示LastName屬性的值。

希望這會導致你在正確的方向。