Ajax PageMethods with Cookie-less Sessions

Earlier this week I had to implement an auto-complete textbox (ala Google Suggest) in a web application.  As much as I wanted to use the newly-supported-by-MS jQuery framework, the application was already using the ASP.NET Ajax library, so I used the AutoCompleteExtender control from the AjaxToolkit.

However, the implementation took longer than expected, so I thought I’d better blog the problem so I don’t spend too long debugging it the next time it happens!

After five minutes later, I had the extender control wired into the page, and set it to call a PageMethod - which returned a hard-coded list of strings for testing.  However, when I ran the page I didn’t get any suggestions.  A quick check of the JavaScript console in FireFox didn’t report any errors, so I returned to the PageMethod to check that the required attributes ([WebMethod], and [ScriptService]) were present.  No problems there.  Hmm, load the page again, this time with the debugger attached to IIS and a break point in the page load.  Nothing - the callback to the PageMethod clearly wasn’t happening but no errors on the client.  Try again in IE.  Same problem.  Argh.

Right, back to basics, so I used the fantastic FireBug add-on to check what was being requested from the server, and there was the problem.  The request to the PageMethod was returning 500 - Server Error.  However, IIS was serving this error before any of my code was being executed.  I decided to create a simple project with the AutoCompleteExtender so that I could test in isolation.

ARGH!  It works in the test project!  It’s exactly the same!!  Then, it twigged, the ‘real’ application uses cookieless sessions.  Set that in the web.config of the test application.  Boom!  IIS returned Server Error.  Excellent.  PageMethods don’t work with SessionID’s in the Url.  Thanks. For. That.

By setting the Extender control to use a WebService instead of a PageMethod everything worked as expected.  Now to get the wasted 2 hours of my life back…