- /*
- * MS 06-04-11 added use of IHttpAsyncHandler when configured with AjaxMethod attribute
- *
- *
- */
- using System;
- using System.IO;
- using System.Web;
- using System.Web.Caching;
- namespace AjaxPro
- {
- public class AjaxHandlerFactory : IHttpHandlerFactory
- {
- #region IHttpHandlerFactory Members
- public void ReleaseHandler(IHttpHandler handler)
- {
- // TODO: Add AjaxHandlerFactory.ReleaseHandler implementation
- }
- public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
- {
- // First of all we want to check what a request is running. There are three different
- // requests that are made to this handler:
- // 1) GET core.ashx which will include the common AJAX communication
- // 2) GET typename,assemblyname.ashx which will return the AJAX wrapper JavaScript code
- // 3) POST typename,assemblyname.ashx which will invoke a method.
- // The first two requests will return the JavaScript code or a HTTP 304 (not changed).
- string filename = Path.GetFileNameWithoutExtension(context.Request.Path);
- Type t = null;
- switch(requestType)
- {
- case "GET": // get the JavaScript files
- switch(filename.ToLower())
- {
- case "core":
- return new EmbeddedJavaScriptHandler("core");
- case "prototype":
- return new EmbeddedJavaScriptHandler("prototype");
- case "converter":
- return new ConverterJavaScriptHandler();
- default:
- if(Utility.Settings.UrlNamespaceMappings.Contains(filename))
- t = Type.GetType(Utility.Settings.UrlNamespaceMappings[filename].ToString());
- if(t == null)
- t = Type.GetType(filename);
- return new TypeJavaScriptHandler(t);
- }
- case "POST": // invoke the method
- if(Utility.Settings != null && Utility.Settings.UrlNamespaceMappings.Contains(filename))
- t = Type.GetType(Utility.Settings.UrlNamespaceMappings[filename].ToString());
- if(t == null)
- t = Type.GetType(filename);
- IAjaxProcessor[] p = new IAjaxProcessor[2];
- p[0] = new XmlHttpRequestProcessor(context, t);
- p[1] = new IFrameProcessor(context, t);
- for(int i=0; i<p.Length; i++)
- {
- if(p[i].CanHandleRequest)
- {
- AjaxMethodAttribute[] ma = (AjaxMethodAttribute[])p[i].Method.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
- if(ma.Length > 0)
- {
- if (ma[0].RequireSessionState == HttpSessionStateRequirement.Read)
- {
- if(!ma[0].UseAsyncProcessing)
- return new AjaxSyncHttpHandlerSessionReadOnly(p[i]);
- else
- return new AjaxAsyncHttpHandlerSessionReadOnly(p[i]);
- }
- else if (ma[0].RequireSessionState == HttpSessionStateRequirement.ReadWrite)
- {
- if(!ma[0].UseAsyncProcessing)
- return new AjaxSyncHttpHandlerSession(p[i]);
- else
- return new AjaxAsyncHttpHandlerSession(p[i]);
- }
- }
- if(!ma[0].UseAsyncProcessing)
- return new AjaxSyncHttpHandler(p[i]);
- else
- return new AjaxAsyncHttpHandler(p[i]);
- }
- }
- break;
- }
- return null;
- }
- #endregion
- }
- }