2010-09-21 71 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属性的值。

希望这会导致你在正确的方向。