.NET AJAX Calls to ASMX or ASPX or ASHX?

Viewed 23066

What is the most efficient way of calling some business logic from javascript on the client side using AJAX? It looks like you can call a [WebMethod] on an aspx directly from javascript (in my case I'm using JQuery to help out) OR you can call a .asmx directly. Which call incurs less overhead? What is the best practice?

Also, what does the [ScriptService] attribute do on a class? I have never used this before on my .aspx [WebMethod] methods and everything seems to be working fine.

I'm hoping this is a purely objective question. Thanks in advance!

3 Answers

The ScriptService stuff in my opinion is a hidden gem in asp.net. Calls to the script service do not passback form data + viewstate, they are lean, fast JSON payloads.

Heres the best part, ASP.NET3.5's scriptmanager can do most of the work for you regarding generating a JS method for you to call and also setting up any JS classes needed.

A simple example for fetching details for a "Person", assuming Person is a C# class.

In PersonService.asmx:

namespace MyProj.Services {
  [System.Web.Script.Services.ScriptService]
  [System.Web.Script.Services.GenerateScriptType(typeof(Person))] 
  public class PersonService : System.Web.Services.WebService
  {
    [WebMethod, ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public Person GetPersonDetails(int id)
    { 
       /* return Logic here */
    }
  }
}

In DetailsPage.aspx

<asp:ScriptManager ID="ScriptManager1" runat="server">
 <Services>
  <asp:ServiceReference Path="~/Services/PersonService.asmx" />
 </Services>
</asp:ScriptManager>

By using a setup like this, you won't even need the help of JQuery to call the service and get back a JS version of your C# Person class, .net does that all for you. An example of using this service from JS would be:

MyProj.Services.PersonService.GetPersonDetails(id, _onDetailsCallbackSuccess, _requestFailed, null);

_onDetailsCallbackSuccess: function(result, userContext, methodName) {
 //all persons properties are now intact and available
 document.getElementById('txtFirstname').value = result.Firtname;
}

Anyway, it would be more then worth looking into the ASP.NET Ajax ScriptService stuff. Even if you decide not to use it this time it's a pretty wicked feature.

Links

If server-side overhead is all you care about, then sending a simple GET with a query string to an ASHX would probably be it. It's definitely preferable to an .ASPX, which is going to go through a page life-cycle that you don't need.

The advantage of an ASMX web method is that it's built on a standard that can be called by other technologies easily (supports discovery). With some documentation, your .ASHX will be just as easy to call, though.

The way you worded your question, I believe you're considering the difference between an ASMX "ScriptService", an ASHX HttpHandler, and an ASP.NET AJAX "PageMethod" (not an actual ASPX Page).

If this is the case, they are all very similar. The ASP.NET AJAX PageMethods are, for all intents and purposes, identical to ASMX ScriptServices. They don't create an instance of the Page, so they don't incur the overhead normally associated with ASPX pages.

Unless you're talking about saturating the server with requests, you'll probably find that all three perform comparably.

Related