ASP Page as Remote Function call from Javascript

Discussion in 'ASP General' started by Martin Waller, Sep 28, 2004.

  1. 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
     
    Martin Waller, Sep 28, 2004
    #1
    1. Advertising

  2. 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.
     
    Bob Barrows [MVP], Sep 28, 2004
    #2
    1. Advertising

  3. 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]" <> wrote in message
    news:u$...
    > 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.
    >
    >
     
    Martin Waller, Sep 28, 2004
    #3
  4. Martin Waller

    Mark Schupp Guest

    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" <> wrote in message
    news:...
    > 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]" <> wrote in message
    > news:u$...
    > > 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.
    > >
    > >

    >
    >
     
    Mark Schupp, Sep 28, 2004
    #4
  5. 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" <> wrote in message
    news:u$ymN#...
    > 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" <> wrote in message
    > news:...
    > > 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]" <> wrote in message
    > > news:u$...
    > > > 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.
    > > >
    > > >

    > >
    > >

    >
    >
     
    Martin Waller, Sep 28, 2004
    #5
  6. Martin Waller

    goinoutwest Guest

    "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
     
    goinoutwest, Sep 29, 2004
    #6
  7. 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" <> wrote in message
    news:...
    > "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
    >
    >
     
    Martin Waller, Sep 29, 2004
    #7
  8. Martin Waller

    goinoutwest Guest

    "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
     
    goinoutwest, Sep 30, 2004
    #8
  9. 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" <> wrote in message
    news:#...
    > "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
    >
    >
     
    Martin Waller, Oct 7, 2004
    #9
  10. Martin Waller

    goinoutwest Guest

    "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');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
     
    goinoutwest, Oct 7, 2004
    #10
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Buu Nguyen

    RMI: remote call or local call

    Buu Nguyen, Sep 9, 2004, in forum: Java
    Replies:
    5
    Views:
    804
    Esmond Pitt
    Sep 17, 2004
  2. grbgooglefan
    Replies:
    2
    Views:
    439
    Pascal Bourguignon
    Jan 30, 2008
  3. grbgooglefan
    Replies:
    4
    Views:
    458
    Kenny McCormack
    Jan 30, 2008
  4. davidj411
    Replies:
    7
    Views:
    3,320
    Tim Golden
    Oct 8, 2009
  5. nabilo
    Replies:
    1
    Views:
    158
    Jim Davis
    Sep 23, 2005
Loading...

Share This Page