An ASP.NET WebService JSON Proxy Generator

Posted on June 30, 2007. Filed under: Ajax, ASP.NET, javascript, Programming, Web Services |

On sites that I develop, I sometimes prefer to deliver plain-vanilla html pages instead of ASP.NET ASPX pages, and to use web services on the back-end to perform my processing. The problem is that it is necessary to write code to call these web services, and unless you have a proxy generator available, you have to write a lot of javascript, potentially have ugly code, must duplicate a lot of it, etc., etc. In any case, it can be time consuming.

There are a number of implementations of systems that allow you to call back-end services from HTML pages. One popular one is Jayrock, a system that uses ASP.NET handlers subclassed off Jayrock foundation classes to generate javascript proxies. Another method is one defined in an article written by Matthias Hertel, in which SOAP proxies are generated by an ASPX page called in the <script> tag. There are drawbacks to both of these systems that I don’t like; Jayrock, for example, requires you to set up HTTP handlers on your site, and requires that you subclass off the Jayrock foundation classes. The Hertel method uses SOAP, and I prefer to use JSON, a much simpler, less wordy protocol.

The Hertel architecture is interesting to me, because it allows me to write “pure” web services and not HTTP handlers that inherit from a 3rd party class library, so I used that as a starting point for my own system. In Hertel, an ASPX page loads the WSDL for a specified webservice and uses XSLT to transform it into a bunch of Javascript that calls the services via SOAP. I took the same approach and instead generated JSON proxies. The result is that you can do the following in your javascript:

<script type="text/javascript" src="GetJavaScriptProxy.aspx?service=Services/TestService.asmx"></script>
function doEcho() {
    TestService.Echo("Hello World", onEchoSuccess, onGenericFailure);

function onEchoSuccess(result) {
    alert("success: " + result);

function onGenericFailure(result) {
    alert("failure: " + result.responseText);

When the GetJavaScriptProxy code is called, it parses the WSDL and generates pure javascript. The generated Javascript looks like this:

 TestService = {
    url: "http://localhost:62657/TestSite/Services/TestService.asmx",

    callAsync: function(func, params, onSuccess, onFailure)
        {callService("POST", this.url + "/" + func, (params == null ? params : JSON.stringify(params)), onSuccess, onFailure);},

    ExceptionTest: function ( onSuccess, onFailure)
        { this.callAsync("ExceptionTest", null, onSuccess, onFailure); },

    HelloWorld: function ( onSuccess, onFailure)
        { this.callAsync("HelloWorld", null, onSuccess, onFailure); },

    Echo: function (msg, onSuccess, onFailure)
        { this.callAsync("Echo", {msg: msg}, onSuccess, onFailure); }

By including 2 other small javascript libraries, one that provides the actual callService code, and the JSON library from, we have a complete AJAX system that can invoke ASP.NET WebServices using JSON as the protocol, and providing a natural caller model to the javascript coder.

I’ll be packaging the code shortly and making it available; if you are interested, please contact me directly.


Make a Comment

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

2 Responses to “An ASP.NET WebService JSON Proxy Generator”

RSS Feed for Greg Pasquariello Comments RSS Feed

This is exactly what I’m looking for! When do you think you might post the code?

I have to finish testing, zip it up and put it somewhere, but maybe later this weekend. I will also add callbacks to allow you to display “busy animations” while processing is happening.

Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d bloggers like this: