AjaxHandlerFactory.cs
上传用户:szgaoree
上传日期:2009-01-05
资源大小:74k
文件大小:3k
源码类别:

Ajax

开发平台:

C#

  1. /*
  2.  * MS 06-04-11 added use of IHttpAsyncHandler when configured with AjaxMethod attribute
  3.  * 
  4.  * 
  5.  */
  6. using System;
  7. using System.IO;
  8. using System.Web;
  9. using System.Web.Caching;
  10. namespace AjaxPro
  11. {
  12. public class AjaxHandlerFactory : IHttpHandlerFactory
  13. {
  14. #region IHttpHandlerFactory Members
  15. public void ReleaseHandler(IHttpHandler handler)
  16. {
  17. // TODO:  Add AjaxHandlerFactory.ReleaseHandler implementation
  18. }
  19. public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
  20. {
  21. // First of all we want to check what a request is running. There are three different
  22. // requests that are made to this handler:
  23. // 1) GET core.ashx which will include the common AJAX communication
  24. // 2) GET typename,assemblyname.ashx which will return the AJAX wrapper JavaScript code
  25. // 3) POST typename,assemblyname.ashx which will invoke a method.
  26. // The first two requests will return the JavaScript code or a HTTP 304 (not changed).
  27. string filename = Path.GetFileNameWithoutExtension(context.Request.Path);
  28. Type t = null;
  29. switch(requestType)
  30. {
  31. case "GET": // get the JavaScript files
  32. switch(filename.ToLower())
  33. {
  34. case "core":
  35. return new EmbeddedJavaScriptHandler("core");
  36. case "prototype":
  37. return new EmbeddedJavaScriptHandler("prototype");
  38. case "converter":
  39. return new ConverterJavaScriptHandler();
  40. default:
  41. if(Utility.Settings.UrlNamespaceMappings.Contains(filename))
  42. t = Type.GetType(Utility.Settings.UrlNamespaceMappings[filename].ToString());
  43. if(t == null)
  44. t = Type.GetType(filename);
  45. return new TypeJavaScriptHandler(t);
  46. }
  47. case "POST": // invoke the method
  48. if(Utility.Settings != null && Utility.Settings.UrlNamespaceMappings.Contains(filename))
  49. t = Type.GetType(Utility.Settings.UrlNamespaceMappings[filename].ToString());
  50. if(t == null)
  51. t = Type.GetType(filename);
  52. IAjaxProcessor[] p = new IAjaxProcessor[2];
  53. p[0] = new XmlHttpRequestProcessor(context, t);
  54. p[1] = new IFrameProcessor(context, t);
  55. for(int i=0; i<p.Length; i++)
  56. {
  57. if(p[i].CanHandleRequest)
  58. {
  59. AjaxMethodAttribute[] ma = (AjaxMethodAttribute[])p[i].Method.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
  60. if(ma.Length > 0)
  61. {
  62. if (ma[0].RequireSessionState == HttpSessionStateRequirement.Read)
  63. {
  64. if(!ma[0].UseAsyncProcessing)
  65. return new AjaxSyncHttpHandlerSessionReadOnly(p[i]);
  66. else
  67. return new AjaxAsyncHttpHandlerSessionReadOnly(p[i]);
  68. }
  69. else if (ma[0].RequireSessionState == HttpSessionStateRequirement.ReadWrite)
  70. {
  71. if(!ma[0].UseAsyncProcessing)
  72. return new AjaxSyncHttpHandlerSession(p[i]);
  73. else
  74. return new AjaxAsyncHttpHandlerSession(p[i]);
  75. }
  76. }
  77. if(!ma[0].UseAsyncProcessing)
  78. return new AjaxSyncHttpHandler(p[i]);
  79. else
  80. return new AjaxAsyncHttpHandler(p[i]);
  81. }
  82. }
  83. break;
  84. }
  85. return null;
  86. }
  87. #endregion
  88. }
  89. }