I know the following code doesn't work! The data is being returned as a
dataset, however ASP does not recognise datasets and requires a recordset.
Can the datatypes be converted? At the Classic ASP end or .NET end? Can
SOAP toolkit provide the conversion, can any toolkit provide a conversion?
==================================================================================
Web Service Code :
---------------------
dim strSelect as string
dim srcData as ODBCconnection
dim fltData as ODBCdataAdapter
dim myPath as String
myPath = me.Context.Request.ServerVariables("APPL_PHYSICAL_PATH")
dim rtnData as DataSet
strSelect = "SELECT * FROM myDataSource"
' srcData = new ODBCConnection( "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA
SOURCE=" & myPath & "..\data\myDataSource.mdb" )
srcData = new ODBCConnection( "DSN=MyDataSource;uid=;pwd=" )
fltData = new ODBCdataAdapter( strSelect, srcData )
rtnData = new dataset
fltData.fill( rtnData )
return rtnData
==================================================================================
ASP Web Server Code:
-------------------------
SET objSoapClient = Server.CreateObject("MSSOAP.SoapClient")
' needs to be updated with the url of your Web Service WSDL and is
' followed by the Web Service name
objSoapClient.ClientProperty("ServerHTTPRequest") = True
Call
objSoapClient.mssoapinit("http://system.evolucion.co.uk/evolucion-services.asmx?WSDL")
set RecordSet = Server.CreateObject("ADODB.Recordset")
' use the SOAP object to call the Web Method Required
RecordSet = objSoapClient.getEvolucionVersionList()
strOutput = strOutput & "<P>On-Line Result : " & RecordSet.RecordCount
==================================================================================
--
Curt Christianson
Site & Scripts: http://www.Darkfalz.com
Blog: http://blog.Darkfalz.com
"Adam Short" <ad...@phuture-uk.net> wrote in message
news:ObPbSewK...@TK2MSFTNGP14.phx.gbl...
In my opinion, you need to architect your solution better. You could return
a recordset object from the webservice, or a two-dimensional array.
--
Manohar Kamath
Editor, .netWire
www.dotnetwire.com
"Adam Short" <ad...@phuture-uk.net> wrote in message
news:ObPbSewK...@TK2MSFTNGP14.phx.gbl...
No.
The dataset is returned as XML. You have to parse the returned XML Document
to extract your data. You can use the MSXML parser to extract the nodes you
need.
Bob Barrows
--
Microsoft MVP -- ASP/ASP.NET
Please reply to the newsgroup. The email account listed in my From
header is my spam trap, so I don't check it very often. You will get a
quicker response by posting to the newsgroup.
I have looked and not found anything yet?
"Manohar Kamath" <mka...@TAKETHISOUTkamath.com> wrote in message
news:uhaGLpw...@TK2MSFTNGP10.phx.gbl...
A web service returns results in the form of XML. A dotnet page can convert
the XML into the appropriate dotnet object. This cannot be done by vbscript.
You need to parse the returned XML using the methods found in the MSXML
parser: selectNodes, selectSingleNode, etc.
Bob Barrows
--
I will use an array instead, then I will also be able to use the same
webservice when connecting to linux based servers.
"Bob Barrows [MVP]" <reb0...@NOyahoo.SPAMcom> wrote in message
news:Oz8UGszK...@TK2MSFTNGP10.phx.gbl...
// ON THE SERVER -- Web Service
// Add references to ADODB library
// Create a stream object
myStream = new ADODB.Stream();
// Replace the constants with their actual values
recordSet.Save(myStream, adPersistXML);
output = myStream.ReadText(adReadAll);
// Return the XML string, complete with schema
return output;
on the client, just re-create the disconnected recordset
http://support.microsoft.com/kb/263247
--
Manohar Kamath
Editor, .netWire
www.dotnetwire.com
"Bob Barrows [MVP]" <reb0...@NOyahoo.SPAMcom> wrote in message
news:Oz8UGszK...@TK2MSFTNGP10.phx.gbl...
I do appreciate that you are answering the question that was asked. But I do
feel the need to express this reservation:
My only issue with this solution is that it will force ALL consumers of this
service to use ADO, essentially forcing any .Net apps that consume it to
also use Interop to process the results. I realize that you could pass a
flag indicating how the results should be returned (dataset vs recordset)
but that forces the developer to maintain two sets of code that do
essentially the same thing. My preference would be to simply create a sparse
xml document containing the data and return that.
However, if this service is intended to be consumed only by non-.Net
applications, then go for it.
Bob Barrows
Not really, since we still return XML that you can parse it to get back
results -- no different from say if you returned "plain xml." The solution
will not apply to all situations. I am only suggesting based on the case in
hand.
--
Manohar Kamath
Editor, .netWire
www.dotnetwire.com
"Bob Barrows [MVP]" <reb0...@NOyahoo.SPAMcom> wrote in message
news:erJZz37K...@TK2MSFTNGP12.phx.gbl...
But now we are back to my initial suggestion that the poster parse the
dataset xml in his classic ASP application to extract his data. :-)
Except that you are suggesting the reverse: that the .Net consumer parse the
recordset XML to extract his data. :-)
> no different from say if you returned "plain xml."
I'm just saying that my preference would be to avoid the Interop.
> The solution will not apply to all situations. I am only suggesting
> based on the case in hand.
That's why I said:
>> I do appreciate that you are answering the question that was asked.
Bob Barrows
The scenario follows;
Windows 2003 Server has web services.
Classic ASP, ASP.NET & PHP Websites will eventually need the ability to get
the data.
I am now looking at the possibility of passing back an array of objects.
i.e.
MyClass
{
obj1 as Integer
obj2 as String
}
The Web Service generates a structure very well indeed and all looks well.
However when I try to read the object at the Classic ASP side it fails. I
understand passing through to .NET should be easy, so what do you guys
think?
My tests so far show that SOAPClient can easily interpret strings and
integers, although I am having difficulty with arrays of these types.
My ASP code looks like this
SET objSoapClient = Server.CreateObject("MSSOAP.SoapClient")
' needs to be updated with the url of your Web Service WSDL and is
' followed by the Web Service name
objSoapClient.ClientProperty("ServerHTTPRequest") = True
Call objSoapClient.mssoapinit("http://domain/script.asmx?WSDL")
' use the SOAP object to call the Web Method Required
thisData = objSoapClient.testInteger()
strOutput = strOutput & "<P>On-Line Result : " & thisData
thisData = objSoapClient.testString()
strOutput = strOutput & "<P>On-Line Result : " & thisData
thisData = objSoapClient.testObject()
strOutput = strOutput & "<P>On-Line Result : " & thisData.Filename
thisData = objSoapClient.testIntegerArray()
strOutput = strOutput & "<P>On-Line Result : " & thisData(0)
set objSoapClient = nothing
How can I get SOAP to read the integer array? as the above code doesn't
work, also, why is the object not being created as I understand the SOAP
toolkit shoul be able to cope with this.
Here is a snippet from the Web Services script
<webmethod()> public function testIntegerArray() as integer()
Dim MyList(2) As integer
MyList(0)=1000
MyList(1)=2000
Return MyList
end function
<webmethod()> public function testObject() as
DataTypesVB.Enumerations.EvolucionVersionList
Dim MyList As DataTypesVB.Enumerations.EvolucionVersionList
MyList = New DataTypesVB.Enumerations.EvolucionVersionList()
MyList.FileName="test.asp"
MyList.Ver = "1.0"
Return MyList
end function
<webmethod()> public function testString() as String
Dim MyList As String
MyList="test.asp"
Return MyList
end function
<webmethod()> public function testInteger() as integer
Dim MyList As integer
MyList=1000
Return MyList
end function
This is driving me crazy, I'm sure its very simple.
Regards
Adam
"Bob Barrows [MVP]" <reb0...@NOyahoo.SPAMcom> wrote in message
news:OVPdTH8K...@TK2MSFTNGP12.phx.gbl...
A classic ASP consumer can not interpret a system object. All it can do is
parse the XML that is returned. It cannot directly read any objects. You can
see the xml that is returned by browsing to your web service. Use the
interface provided to enter parameters and run the procedure. The resulting
page will show the XML that is being passed to the client. You will need to
use the methods in the msxml parser to extract your data from that XML. Here
are a few articles to help you:
--
Manohar Kamath
Editor, .netWire
www.dotnetwire.com
"Bob Barrows [MVP]" <reb0...@NOyahoo.SPAMcom> wrote in message
news:%23JKCl2%23KFH...@TK2MSFTNGP12.phx.gbl...
Bob
Here's a proof of concept I came up with. Basically, it makes an HTTP GET
call the getEvolucionVersionList operation of your webservice, then loads
the resultant xml into a MSXML2.DomDocument and transforms the xml to html
using a XSLT stylesheet. HTTP, XML and XSLT are all pretty standard, so this
concept should port easily to PHP, ASP.NET, JSP, etc...
[EvolucionVersionList2HTML.xsl]
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
<xsl:template match="NewDataSet">
<html>
<body>
<table>
<tr>
<th>RecordID</th>
<th>ModuleName</th>
<th>Description</th>
<th>FileName</th>
<th>Version</th>
<th>Location</th>
<th>SystemVariable</th>
<th>DateEdited</th>
<th>Status</th>
</tr>
<xsl:apply-templates select="Table"/>
</table>
<xsl:value-of select="count(Table)"/> Record(s)
</body>
</html>
</xsl:template>
<xsl:template match="Table">
<tr>
<td><xsl:value-of select="RecordID"/></td>
<td><xsl:value-of select="ModuleName"/></td>
<td><xsl:value-of select="Description"/></td>
<td><xsl:value-of select="FileName"/></td>
<td><xsl:value-of select="Version"/></td>
<td><xsl:value-of select="Location"/></td>
<td><xsl:value-of select="SystemVariable"/></td>
<td><xsl:value-of select="DateEdited"/></td>
<td><xsl:value-of select="Status"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
[getEvolucionVersionList.asp]
<%
Dim url, http, xml, xsl
url =
"http://system.evolucion.co.uk/evolucion-services.asmx/getEvolucionVersionList"
Set http = CreateObject("MSXML2.ServerXMLHTTP.4.0")
http.Open "GET",url,False
http.Send
Set xml = CreateObject("MSXML2.DOMDocument.4.0")
xml.loadXML http.responseText
Set xsl = CreateObject("MSXML2.DOMDocument.4.0")
xsl.load Server.MapPath("EvolucionVersionList2HTML.xsl")
xml.transformNodeToObject xsl, Response
Set http = Nothing
Set xsl = Nothing
Set xml = Nothing
%>
NOTES:
1. I'm currently using MSXML 4.0. If you're using version 3.0 (which is
likely), you'll need to modify the asp file accordingly. For example,
"MSXML2.ServerXMLHTTP.4.0" would become "MSXML2.ServerXMLHTTP.3.0"
2. I opted not to include the SourceCode data in the html table
presentation.
3. There's nothing wrong with using SOAP to get the data instead of HTTP to
get the data as you did in your origianl code. However, you indicated that
eventually end users would need to be able to consume the service from a
number of different environments. Some of those environments may not have
SOAP, so I wanted to show that it could be done without it.
4. On a completely unrelated note, I noticed that you're using the ".inc"
extension for your include files. Also, it appears you're loading objects
into the Application scope. Here are two articles that explain why these are
not good ideas:
http://aspfaq.com/show.asp?id=2269
http://aspfaq.com/show.asp?id=2053
HTH
-Chris Hohmann
I am fully aware that I could use XMLRPC as you have suggested, but am
really just looking to utilize SOAP as an alternative. More research than
necessity, in fact to be honest I am very disappointed with SOAP on the
whole, and wonder why anyone would implement a system which is so
restrictive.
In the past I have used a hacked XMLRPC procedure developed originally by
David Carter-Tod. Although bugged, I have fixed most of them.
"Chris Hohmann" <nos...@thankyou.com> wrote in message
news:eEYJW9AL...@TK2MSFTNGP15.phx.gbl...
--
Once I've sorted this issue out I will begin testing the final code. If it
works I will post it here.
Thanks Again to everyone
Regards
Adam
"Manohar Kamath" <mka...@TAKETHISOUTkamath.com> wrote in message
news:%23b75e87...@TK2MSFTNGP15.phx.gbl...