Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > ASP General > ASP Page as Remote Function call from Javascript

Reply
Thread Tools

ASP Page as Remote Function call from Javascript

 
 
Martin Waller
Guest
Posts: n/a
 
      09-28-2004
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


 
Reply With Quote
 
 
 
 
Bob Barrows [MVP]
Guest
Posts: n/a
 
      09-28-2004
Martin Waller wrote:
> 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
--
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.


 
Reply With Quote
 
 
 
 
Martin Waller
Guest
Posts: n/a
 
      09-28-2004
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

"Bob Barrows [MVP]" <(E-Mail Removed)> wrote in message
news:u$(E-Mail Removed)...
> Martin Waller wrote:
> > 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
> --
> 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.
>
>



 
Reply With Quote
 
Mark Schupp
Guest
Posts: n/a
 
      09-28-2004
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


"Martin Waller" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> 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
>
> "Bob Barrows [MVP]" <(E-Mail Removed)> wrote in message
> news:u$(E-Mail Removed)...
> > Martin Waller wrote:
> > > 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
> > --
> > 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.
> >
> >

>
>



 
Reply With Quote
 
Martin Waller
Guest
Posts: n/a
 
      09-28-2004
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
"Mark Schupp" <(E-Mail Removed)> wrote in message
news:u$ymN#(E-Mail Removed)...
> 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
>
>
> "Martin Waller" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
> > 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
> >
> > "Bob Barrows [MVP]" <(E-Mail Removed)> wrote in message
> > news:u$(E-Mail Removed)...
> > > Martin Waller wrote:
> > > > 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
> > > --
> > > 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.
> > >
> > >

> >
> >

>
>



 
Reply With Quote
 
goinoutwest
Guest
Posts: n/a
 
      09-29-2004
"Martin Waller" wrote:
> 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


 
Reply With Quote
 
Martin Waller
Guest
Posts: n/a
 
      09-29-2004
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" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> "Martin Waller" wrote:
> > 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
>
>



 
Reply With Quote
 
goinoutwest
Guest
Posts: n/a
 
      09-30-2004
"Martin Waller" wrote:
> 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


 
Reply With Quote
 
Martin Waller
Guest
Posts: n/a
 
      10-07-2004
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

"goinoutwest" <(E-Mail Removed)> wrote in message
news:#(E-Mail Removed)...
> "Martin Waller" wrote:
> > 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
>
>



 
Reply With Quote
 
goinoutwest
Guest
Posts: n/a
 
      10-07-2004
"Martin Waller" wrote:
> 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');handle NewData('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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How to call function whose function call with arguments is in astring grbgooglefan C++ 2 01-30-2008 07:18 AM
Call a javascript function from ASP page Mark ASP General 5 07-27-2006 09:25 PM
How to call a page in a remote site and get the result within your page with javascript nabilo Javascript 1 09-23-2005 05:46 PM
write a function such that when ever i call this function in some other function .it should give me tha data type and value of calling function parameter komal C++ 6 01-25-2005 11:13 AM
Remote Assistance fails to connect, remote remote host name could not be resolved Peter Sale Wireless Networking 1 12-11-2004 09:09 PM



Advertisments