ASP Page as Remote Function call from Javascript

M

Martin Waller

Hello,

I've been playing with the idea of just how to use an ASP page to provide a
remote function call. In an ideal world this would be a web service but how
can you do it if restricted to ASP 3.0 ?

Idea 1 was to write an ASP page that accepted arguments using the classic
?X=1&Y=2 type of strings and have the page return an ADO disconnected record
set containing the results of the action. This is call very well, and works,
but you do have to allow the browser to create an ADODB.RecordSet in which
to place the results which goes against some security principles.

Idea 2 was to use an <IFRAME> and replace the src for this frame at run time
with the result from an ASP page, again using the ?X=1&Y=2 type of string to
pass in arguments. The results could then come back as a table and be
accessed via the DOM. The problem with this is that the client needs to wait
for the page to be loaded before it can be sure that the contents of the
table is valid and the browser does not seem to allow waits and does not
like busy waits.

Idea 3 - I'm still looking for this ! Does anyone have any ?

Many thanks

Martin
 
B

Bob Barrows [MVP]

Martin said:
Hello,

I've been playing with the idea of just how to use an ASP page to
provide a remote function call. In an ideal world this would be a web
service but how can you do it if restricted to ASP 3.0 ?

Idea 1 was to write an ASP page that accepted arguments using the
classic ?X=1&Y=2 type of strings and have the page return an ADO
disconnected record set containing the results of the action. This is
call very well, and works, but you do have to allow the browser to
create an ADODB.RecordSet in which to place the results which goes
against some security principles.

Idea 2 was to use an <IFRAME> and replace the src for this frame at
run time with the result from an ASP page, again using the ?X=1&Y=2
type of string to pass in arguments. The results could then come back
as a table and be accessed via the DOM. The problem with this is that
the client needs to wait for the page to be loaded before it can be
sure that the contents of the table is valid and the browser does not
seem to allow waits and does not like busy waits.

Idea 3 - I'm still looking for this ! Does anyone have any ?

Many thanks

Martin

If I understand correctly what you're after, then the answer is XMLHTTP.
Google should supply the rest ...

Bob Barrows
 
M

Martin Waller

Hello,

Many thanks for the reply but I'm not sure how that gets around having to do
something like:

x = new ActiveXObject("Microsoft.XMLHTTP");

in the JavaScript which requires the setting / unsetting of a security
option in the browser ?

Martin
 
M

Mark Schupp

How about this (uses framesets):

1. Main frame directs "communication" frame to target asp page and then
directs itself to a "waiting" page.
2. Page generated by target asp page includes JavaScript code to redirect
main frame back to original state.

--
Mark Schupp
Head of Development
Integrity eLearning
www.ielearning.com
 
M

Martin Waller

Hello,

One way I've found to get away from the requirement in JavaScript to perform
the new ActiveXObject call is to put the object in the HTML page as it gets
sent to the client and then have the JavaScript call that. See below for an
example. To run this the URL will need to be changed to reflect where you
put it ! In my case it was called junk.asp...

<html>
<head>
<script language="JavaScript">

function Do()
{
alert("Do()");
penguin.open("get","http://localhost/smartanalysis/junk.asp",false);
alert(1);
penguin.send();
alert(2);
alert(penguin.responseText);
}

</script>
<object
classid="clsid:F6D90F16-9C73-11D3-B32E-00C04F990BB4"
id="penguin">
</object>
</head>
<body onLoad = "Do()">
</body>
</html>

Martin
 
G

goinoutwest

Martin Waller said:
I've been playing with the idea of just how to use an ASP page to provide a
remote function call. In an ideal world this would be a web service but how
can you do it if restricted to ASP 3.0 ?
Idea 3 - I'm still looking for this ! Does anyone have any ?

I'm making some assumptions here, but I think: you want the browser to get
some data that the server has. You want the browser to make a client-side
call to get this data without the current page being reloaded. And you
would
like this to be reasonably cross-browser compliant, and not require any
funky
client objects (ActiveXObjects, Object tags, XMLHTTP, etc).

If the above is correct, then this cool trick might work for you.
Put this function on your "main" page:

function getNewJSFile(querystring) {
var s = document.createElement("script");
s.setAttribute("src", "http://you.com/ReturnsJavascriptArray.asp?" +
querystring);
s.setAttribute("type", "text/javascript");
document.getElementsByTagName("head")[0].appendChild(s);
}

That function above is ordinary JavaScript which works in almost all
browsers. (No Netscape 4 or earlier) Now, you can add calls to
getNewJSFile() on your "main" page like this:

<a href="javascript:getNewJSFile('yr=1999&data=sales')">Show 1999
Sales</a>
<a href="javascript:getNewJSFile('yr=2000&data=sales')">Show 2000
Sales</a>

When a user clicks these links, a new Javascript file will be downloaded
by the client. But, the file is actually an ASP3.0 page
(ReturnsJavascriptArray.asp)
which returns Javascript. This allows you to query a database and format
the
response as a Javascript array, like this:

Sales_1999(1, 'Jan', '$234.56');
Sales_1999(2, 'Feb', '$123.45');
Sales_1999(3, 'Mar', '$456.78');

The response can even include functions and function calls:

function show_Sales_1999() {
...code to loop thru array and alert() the sales data
}
show_Sales_1999()

Good Luck!
-Rob
 
M

Martin Waller

Rob,

Nice one !

It seems to work but the one thing I'm not sure about is wether the
appendChild() operation is synchronous or not ? Do you have any idea ?

Many thanks...

Martin

goinoutwest said:
Martin Waller said:
I've been playing with the idea of just how to use an ASP page to
provide
a
remote function call. In an ideal world this would be a web service but how
can you do it if restricted to ASP 3.0 ?
Idea 3 - I'm still looking for this ! Does anyone have any ?

I'm making some assumptions here, but I think: you want the browser to get
some data that the server has. You want the browser to make a client-side
call to get this data without the current page being reloaded. And you
would
like this to be reasonably cross-browser compliant, and not require any
funky
client objects (ActiveXObjects, Object tags, XMLHTTP, etc).

If the above is correct, then this cool trick might work for you.
Put this function on your "main" page:

function getNewJSFile(querystring) {
var s = document.createElement("script");
s.setAttribute("src", "http://you.com/ReturnsJavascriptArray.asp?" +
querystring);
s.setAttribute("type", "text/javascript");
document.getElementsByTagName("head")[0].appendChild(s);
}

That function above is ordinary JavaScript which works in almost all
browsers. (No Netscape 4 or earlier) Now, you can add calls to
getNewJSFile() on your "main" page like this:

<a href="javascript:getNewJSFile('yr=1999&data=sales')">Show 1999
Sales</a>
<a href="javascript:getNewJSFile('yr=2000&data=sales')">Show 2000
Sales</a>

When a user clicks these links, a new Javascript file will be downloaded
by the client. But, the file is actually an ASP3.0 page
(ReturnsJavascriptArray.asp)
which returns Javascript. This allows you to query a database and format
the
response as a Javascript array, like this:

Sales_1999(1, 'Jan', '$234.56');
Sales_1999(2, 'Feb', '$123.45');
Sales_1999(3, 'Mar', '$456.78');

The response can even include functions and function calls:

function show_Sales_1999() {
...code to loop thru array and alert() the sales data
}
show_Sales_1999()

Good Luck!
-Rob
 
G

goinoutwest

Martin Waller said:
Rob,

Nice one !

It seems to work but the one thing I'm not sure about is wether the
appendChild() operation is synchronous or not ? Do you have any idea ?

Many thanks...

Martin

appendChild() is synchronous. But, I don't think when you use it to append
a new script block to the HEAD of a webpage that the code execution stops
and waits for the browser to "see" this new script block and finish
downloading
the file referenced as the SRC of the script block. (did that make sense?)

I have not tested this, but it should be easy to confirm.
-r
 
M

Martin Waller

Rob,

I tried it and as you say the execution does not stop so the loading of the
script is happening after I'm testing for the results so I can't really use
that technique !

Many thanks for trying...

Martin
 
G

goinoutwest

Martin Waller said:
I tried it and as you say the execution does not stop so the loading of the
script is happening after I'm testing for the results so I can't really use
that technique !

That's part of the trick. You probably have some function which handles
the task of "testing for results", right?

You need to put the call to that function as the last line of that newly
downloaded Javascript file.
For example, here is a simplified version of the "main" page:
<html>
<a href="javascript:getNewJSFile('data=sales')">Show Sales</a>
<script>
function getNewJSFile(querystring) {...}
function handleNewData(arrayName) {...}
</script>
</html>

And here's a simplified version of that new javascript file that will be
downloaded when that link is clicked:
/* begin code */
SalesData(1, '$234.56');
SalesData(2, '$123.45');
SalesData(3, '$456.78');
handleNewData('SalesData');
/* end code */

So, you can see that the data will arrive just before the call to the
function
which is designed to handle that data. It will always work! My guess is
that you were doing something equivalent to this:
<a
href="javascript:getNewJSFile('data=sales');handleNewData('SalesData');">Sho
w Sales</a>
In that case, the call to handle the data is going to happen before the data
arrives.
That's bad.

-Rob
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top