/// <summary>
        /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler"></see> interface.
        /// </summary>
        /// <param name="context">An <see cref="T:System.Web.HttpContext"></see> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param>
        public void ProcessRequest(HttpContext context)
        {
            // The request was not a request to invoke a server-side method.
            // Now, we will render the Javascript that will be used on the
            // client to run as a proxy or wrapper for the methods marked
            // with the AjaxMethodAttribute.

            if (context.Trace.IsEnabled)
            {
                context.Trace.Write(Constant.AjaxID, "Render class proxy Javascript");
            }


            // Check wether the javascript is already rendered and cached in the
            // current context.

            string etag     = context.Request.Headers["If-None-Match"];
            string modSince = context.Request.Headers["If-Modified-Since"];

            string path = type.FullName + "," + type.Assembly.FullName.Split(',')[0];

            if (Utility.Settings.UseAssemblyQualifiedName)
            {
                path = type.AssemblyQualifiedName;
            }

            if (Utility.Settings != null && Utility.Settings.UrlNamespaceMappings.ContainsValue(path))
            {
                foreach (string key in Utility.Settings.UrlNamespaceMappings.Keys)
                {
                    if (Utility.Settings.UrlNamespaceMappings[key].ToString() == path)
                    {
                        path = key;
                        break;
                    }
                }
            }

            if (context.Cache[path] != null)
            {
                CacheInfo ci = (CacheInfo)context.Cache[path];

                if (etag != null)
                {
                    if (etag == ci.ETag)                                // TODO: null check
                    {
                        context.Response.StatusCode      = 304;
                        context.Response.SuppressContent = true;
                        return;
                    }
                }

                if (modSince != null)
                {
                    if (modSince.IndexOf(";") > 0)
                    {
                        // If-Modified-Since: Tue, 06 Jun 2006 10:13:38 GMT; length=2935
                        modSince = modSince.Split(';')[0];
                    }

                    try
                    {
                        DateTime modSinced = Convert.ToDateTime(modSince.ToString()).ToUniversalTime();
                        if (DateTime.Compare(modSinced, ci.LastModified.ToUniversalTime()) >= 0)
                        {
                            context.Response.StatusCode      = 304;
                            context.Response.SuppressContent = true;
                            return;
                        }
                    }
                    catch (FormatException)
                    {
                        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.");
                        }
                    }
                }
            }

            etag = type.AssemblyQualifiedName;
            etag = MD5Helper.GetHash(System.Text.Encoding.Default.GetBytes(etag));

            DateTime now     = DateTime.Now;
            DateTime lastMod = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);             // .ToUniversalTime();

            context.Response.AddHeader("Content-Type", "application/x-javascript");
            context.Response.ContentEncoding = System.Text.Encoding.UTF8;
            context.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
            context.Response.Cache.SetETag(etag);
            context.Response.Cache.SetLastModified(lastMod);

            // Ok, we do not have the javascript rendered, yet.
            // Build the javascript source and save it to the current
            // Application context.


            string url = context.Request.ApplicationPath + (context.Request.ApplicationPath.EndsWith("/") ? "" : "/") + Utility.HandlerPath + "/" + AjaxPro.Utility.GetSessionUri() + path + Utility.HandlerExtension;



            // find all methods that are able to be used with AjaxPro

            MethodInfo[] mi = type.GetMethods();
            MethodInfo   method;

#if (NET20)
            List <MethodInfo> methods = new List <MethodInfo>();
#else
            MethodInfo[] methods;
            System.Collections.ArrayList methodList = new System.Collections.ArrayList();

            int mc = 0;
#endif

            for (int y = 0; y < mi.Length; y++)
            {
                method = mi[y];

                if (!method.IsPublic)
                {
                    continue;
                }

                AjaxMethodAttribute[] ma = (AjaxMethodAttribute[])method.GetCustomAttributes(typeof(AjaxMethodAttribute), true);

                if (ma.Length == 0)
                {
                    continue;
                }

                PrincipalPermissionAttribute[] ppa = (PrincipalPermissionAttribute[])method.GetCustomAttributes(typeof(PrincipalPermissionAttribute), true);
                if (ppa.Length > 0)
                {
                    bool permissionDenied = true;
                    for (int p = 0; p < ppa.Length && permissionDenied; p++)
                    {
#if (_____NET20)
                        if (Roles.Enabled)
                        {
                            try
                            {
                                if (!String.IsNullOrEmpty(ppa[p].Role) && !Roles.IsUserInRole(ppa[p].Role))
                                {
                                    continue;
                                }
                            }
                            catch (Exception)
                            {
                                // Should we disable this AjaxMethod of there is an exception?
                                continue;
                            }
                        }
                        else
#endif
                        if (ppa[p].Role != null && ppa[p].Role.Length > 0 && context.User != null && context.User.Identity.IsAuthenticated && !context.User.IsInRole(ppa[p].Role))
                        {
                            continue;
                        }

                        permissionDenied = false;
                    }

                    if (permissionDenied)
                    {
                        continue;
                    }
                }

#if (NET20)
                methods.Add(method);
#else
                //methods[mc++] = method;
                methodList.Add(method);
#endif
            }

#if (!NET20)
            methods = (MethodInfo[])methodList.ToArray(typeof(MethodInfo));
#endif

            // render client-side proxy file

            System.Text.StringBuilder sb  = new System.Text.StringBuilder();
            TypeJavaScriptProvider    jsp = null;

            if (Utility.Settings.TypeJavaScriptProvider != null)
            {
                try
                {
                    Type jspt = Type.GetType(Utility.Settings.TypeJavaScriptProvider);
                    if (jspt != null && typeof(TypeJavaScriptProvider).IsAssignableFrom(jspt))
                    {
                        jsp = (TypeJavaScriptProvider)Activator.CreateInstance(jspt, new object[3] {
                            type, url, sb
                        });
                    }
                }
                catch (Exception)
                {
                }
            }

            if (jsp == null)
            {
                jsp = new TypeJavaScriptProvider(type, url, sb);
            }

            jsp.RenderNamespace();
            jsp.RenderClassBegin();
#if (NET20)
            jsp.RenderMethods(methods.ToArray());
#else
            jsp.RenderMethods(methods);
#endif
            jsp.RenderClassEnd();

            context.Response.Write(sb.ToString());
            context.Response.Write("\r\n");


            // save the javascript in current Application context to
            // speed up the next requests.

            // TODO: was können wir hier machen??
            // System.Web.Caching.CacheDependency fileDepend = new System.Web.Caching.CacheDependency(type.Assembly.Location);

            context.Cache.Add(path, new CacheInfo(etag, lastMod), null,
                              System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration,
                              System.Web.Caching.CacheItemPriority.Normal, null);

            if (context.Trace.IsEnabled)
            {
                context.Trace.Write(Constant.AjaxID, "End ProcessRequest");
            }
        }
        /// <summary>
        /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler"></see> interface.
        /// </summary>
        /// <param name="context">An <see cref="T:System.Web.HttpContext"></see> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param>
        public void ProcessRequest(HttpContext context)
        {
            string etag     = context.Request.Headers["If-None-Match"];
            string modSince = context.Request.Headers["If-Modified-Since"];

            if (context.Cache[Constant.AjaxID + ".converter"] != null)
            {
                CacheInfo ci = (CacheInfo)context.Cache[Constant.AjaxID + ".converter"];

                if (etag != null)
                {
                    if (etag == ci.ETag)                                // TODO: null check
                    {
                        context.Response.StatusCode = 304;
                        return;
                    }
                }

                if (modSince != null)
                {
                    if (modSince.IndexOf(";") > 0)
                    {
                        // If-Modified-Since: Tue, 06 Jun 2006 10:13:38 GMT; length=2935
                        modSince = modSince.Split(';')[0];
                    }

                    try
                    {
                        DateTime modSinced = Convert.ToDateTime(modSince.ToString()).ToUniversalTime();
                        if (DateTime.Compare(modSinced, ci.LastModified.ToUniversalTime()) >= 0)
                        {
                            context.Response.StatusCode = 304;
                            return;
                        }
                    }
                    catch (FormatException)
                    {
                        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.");
                        }
                    }
                }
            }

            etag = MD5Helper.GetHash(System.Text.Encoding.Default.GetBytes("converter"));

            DateTime now     = DateTime.Now;
            DateTime lastMod = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);             //.ToUniversalTime();

            context.Response.AddHeader("Content-Type", "application/x-javascript");
            context.Response.ContentEncoding = System.Text.Encoding.UTF8;
            context.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
            context.Response.Cache.SetETag(etag);
            context.Response.Cache.SetLastModified(lastMod);

            context.Response.Write(@"//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------
// Converter.js

");

            if (Utility.Settings != null && Utility.Settings.Security != null)
            {
                try
                {
                    string secrityScript = Utility.Settings.Security.SecurityProvider.ClientScript;

                    if (secrityScript != null && secrityScript.Length > 0)
                    {
                        context.Response.Write(secrityScript);
                        context.Response.Write("\r\n");
                    }
                }
                catch (Exception)
                {
                }
            }

            StringCollection     convTypes = new StringCollection();
            string               convTypeName;
            IJavaScriptConverter c;
            string               script;

            IEnumerator s = Utility.Settings.SerializableConverters.Values.GetEnumerator();

            while (s.MoveNext())
            {
                c            = (IJavaScriptConverter)s.Current;
                convTypeName = c.GetType().FullName;
                if (!convTypes.Contains(convTypeName))
                {
                    script = c.GetClientScript();

                    if (script.Length > 0)
                    {
#if (NET20)
                        if (!String.IsNullOrEmpty(c.ConverterName))
#else
                        if (c.ConverterName != null && c.ConverterName.Length > 0)
#endif
                        { context.Response.Write("// " + c.ConverterName + "\r\n"); }
                        context.Response.Write(c.GetClientScript());
                        context.Response.Write("\r\n");
                    }

                    convTypes.Add(convTypeName);
                }
            }

            IEnumerator d = Utility.Settings.DeserializableConverters.Values.GetEnumerator();
            while (d.MoveNext())
            {
                c            = (IJavaScriptConverter)d.Current;
                convTypeName = c.GetType().FullName;
                if (!convTypes.Contains(convTypeName))
                {
                    script = c.GetClientScript();

                    if (script.Length > 0)
                    {
#if (NET20)
                        if (!String.IsNullOrEmpty(c.ConverterName))
#else
                        if (c.ConverterName != null && c.ConverterName.Length > 0)
#endif

                        { context.Response.Write("// " + c.ConverterName + "\r\n"); }
                        context.Response.Write(c.GetClientScript());
                        context.Response.Write("\r\n");
                    }

                    convTypes.Add(convTypeName);
                }
            }

            context.Cache.Add(Constant.AjaxID + ".converter", new CacheInfo(etag, lastMod), null,
                              System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration,
                              System.Web.Caching.CacheItemPriority.Normal, null);
        }
示例#3
0
        /// <summary>
        /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler"></see> interface.
        /// </summary>
        /// <param name="context">An <see cref="T:System.Web.HttpContext"></see> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param>
        public void ProcessRequest(HttpContext context)
        {
            string etag     = context.Request.Headers["If-None-Match"];
            string modSince = context.Request.Headers["If-Modified-Since"];

            if (context.Cache[Constant.AjaxID + "." + fileName] != null)
            {
                CacheInfo ci = (CacheInfo)context.Cache[Constant.AjaxID + "." + fileName];

                if (etag != null)
                {
                    if (etag == ci.ETag)                                // TODO: null check
                    {
                        context.Response.StatusCode = 304;
                        return;
                    }
                }

                if (modSince != null)
                {
                    if (modSince.IndexOf(";") > 0)
                    {
                        // If-Modified-Since: Tue, 06 Jun 2006 10:13:38 GMT; length=2935
                        modSince = modSince.Split(';')[0];
                    }

                    try
                    {
                        DateTime modSinced = Convert.ToDateTime(modSince.ToString()).ToUniversalTime();
                        if (DateTime.Compare(modSinced, ci.LastModified.ToUniversalTime()) >= 0)
                        {
                            context.Response.StatusCode = 304;
                            return;
                        }
                    }
                    catch (FormatException)
                    {
                        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.");
                        }
                    }
                }
            }

            etag = MD5Helper.GetHash(System.Text.Encoding.Default.GetBytes(fileName));

            DateTime now     = DateTime.Now;
            DateTime lastMod = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);             //.ToUniversalTime();

            context.Response.AddHeader("Content-Type", "application/x-javascript");
            context.Response.ContentEncoding = System.Text.Encoding.UTF8;
            context.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
            context.Response.Cache.SetETag(etag);
            context.Response.Cache.SetLastModified(lastMod);

            context.Response.Write(@"//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------

");

            // Now, we want to read the JavaScript embedded source
            // from the assembly. If the filename includes any comma
            // we have to return more than one embedded JavaScript file.

            if (fileName != null && fileName.Length > 0)
            {
                string[] files    = fileName.Split(',');
                Assembly assembly = Assembly.GetExecutingAssembly();
                Stream   s;

                for (int i = 0; i < files.Length; i++)
                {
                    s = assembly.GetManifestResourceStream(Constant.AssemblyName + "." + files[i] + ".js");

                    if (s != null)
                    {
                        System.IO.StreamReader sr = new System.IO.StreamReader(s);

                        context.Response.Write("// " + files[i] + ".js\r\n");

                        context.Response.Write(sr.ReadToEnd());
                        context.Response.Write("\r\n");

                        sr.Close();

                        if (files[i] == "prototype" && AjaxPro.Utility.Settings.OldStyle.Contains("objectExtendPrototype"))
                        {
                            context.Response.Write(@"
Object.prototype.extend = function(o, override) {
	return Object.extend.apply(this, [this, o, override != false]);
}
");
                        }
                    }
                }
            }

            context.Cache.Add(Constant.AjaxID + "." + fileName, new CacheInfo(etag, lastMod), null,
                              System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration,
                              System.Web.Caching.CacheItemPriority.Normal, null);
        }