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

Ajax

开发平台:

C#

  1. /*
  2.  * MS 06-04-05 added oldstyled Object.prototype.extend code, enabled by web.config
  3.  * setting oldStyleobjectExtendPrototype
  4.  * 
  5.  * 
  6.  * 
  7.  */
  8. using System;
  9. using System.Reflection;
  10. using System.Web;
  11. using System.Web.Caching;
  12. using System.IO;
  13. namespace AjaxPro
  14. {
  15. /// <summary>
  16. /// Represents an IHttpHandler for the client-side JavaScript prototype and core methods.
  17. /// </summary>
  18. public class EmbeddedJavaScriptHandler : IHttpHandler
  19. {
  20. private string fileName;
  21. public EmbeddedJavaScriptHandler(string fileName)
  22. {
  23. this.fileName = fileName;
  24. }
  25. #region IHttpHandler Members
  26. public void ProcessRequest(HttpContext context)
  27. {
  28. string etag = context.Request.Headers["If-None-Match"];
  29. string modSince = context.Request.Headers["If-Modified-Since"];
  30. if(context.Cache[Constant.AjaxID + "." + fileName] != null)
  31. {
  32. CacheInfo ci = (CacheInfo)context.Cache[Constant.AjaxID + "." + fileName];
  33. if(etag != null)
  34. {
  35. if(etag == ci.ETag) // TODO: null check
  36. {
  37. context.Response.StatusCode = 304;
  38. return;
  39. }
  40. }
  41. if(modSince != null)
  42. {
  43. try
  44. {
  45. DateTime modSinced = Convert.ToDateTime(modSince.ToString()).ToUniversalTime();
  46. if(DateTime.Compare(modSinced, ci.LastModified.ToUniversalTime()) >= 0)
  47. {
  48. context.Response.StatusCode = 304;
  49. return;
  50. }
  51. }
  52. catch(Exception)
  53. {
  54. if(context.Trace.IsEnabled) context.Trace.Write(Constant.AjaxID, "The header value for If-Modified-Since = " + modSince + " could not be converted to a System.DateTime.");
  55. }
  56. }
  57. }
  58. etag = MD5Helper.GetHash(System.Text.Encoding.Default.GetBytes(fileName));
  59. DateTime now = DateTime.Now;
  60. DateTime lastMod = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second); //.ToUniversalTime();
  61. context.Response.AddHeader("Content-Type", "application/x-javascript");
  62. context.Response.ContentEncoding = System.Text.Encoding.UTF8;
  63. context.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
  64. context.Response.Cache.SetETag(etag);
  65. context.Response.Cache.SetLastModified(lastMod);
  66. // Now, we want to read the JavaScript embedded source
  67. // from the assembly.
  68. Assembly assembly = Assembly.GetExecutingAssembly();
  69. Stream s = assembly.GetManifestResourceStream(Constant.AssemblyName + "." + fileName + ".js");
  70. if(s != null)
  71. {
  72. System.IO.StreamReader sr = new System.IO.StreamReader(s);
  73. context.Response.Write(sr.ReadToEnd());
  74. context.Response.Write("rn");
  75. sr.Close();
  76. if (fileName == "prototype")
  77. {
  78. if (AjaxPro.Utility.Settings.OldStyle.Contains("objectExtendPrototype"))
  79. {
  80. context.Response.Write(@"
  81. Object.prototype.extend = function(o, override) {
  82. return Object.extend.apply(this, [this, o, override != false]);
  83. }
  84. ");
  85. }
  86. }
  87. }
  88. context.Cache.Add(Constant.AjaxID + "." + fileName, new CacheInfo(etag, lastMod), null, 
  89. System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration,
  90. System.Web.Caching.CacheItemPriority.Normal, null);
  91. }
  92. public bool IsReusable
  93. {
  94. get
  95. {
  96. return false;
  97. }
  98. }
  99. #endregion
  100. }
  101. }