public override void ProcessRequest(HttpRequestArgs args)
        {
            //if the source request url isn't aassociated with an item, skip this processor
            if (Context.Item == null)
            {
                return;
            }

            string       itemId          = Context.Item.ID.ToString();
            ItemRedirect resolvedMapping = this.GetResolvedMapping(itemId);

            if (resolvedMapping == null)
            {
                resolvedMapping = this.FindMapping(itemId);

                if (resolvedMapping != null)
                {
                    var dictionaryitem = GetCache <Dictionary <string, ItemRedirect> >(ResolvedItemRedirectPrefix)
                                         ?? new Dictionary <string, ItemRedirect>();

                    dictionaryitem[itemId] = resolvedMapping;

                    SetCache(ResolvedItemRedirectPrefix, dictionaryitem);
                }
            }

            if (resolvedMapping != null && HttpContext.Current != null)
            {
                if (!resolvedMapping.Target.IsNullOrEmpty())
                {
                    //if we are preserving the incoming query string, append it now
                    GetPreservedQueryString(resolvedMapping);

                    if (resolvedMapping.RedirectType == RedirectType.Redirect301)
                    {
                        this.Redirect301(HttpContext.Current.Response, resolvedMapping.Target);
                    }
                    else if (resolvedMapping.RedirectType == RedirectType.Redirect302)
                    {
                        HttpContext.Current.Response.Redirect(resolvedMapping.Target, true);
                    }
                    else if (resolvedMapping.RedirectType == RedirectType.ServerTransfer)
                    {
                        HttpContext.Current.Server.TransferRequest(resolvedMapping.Target);
                    }
                    //default to 302
                    else
                    {
                        HttpContext.Current.Response.Redirect(resolvedMapping.Target, true);
                    }

                    args.AbortPipeline();
                }
            }
        }
        protected virtual ItemRedirect FindMapping(string itemId)
        {
            ItemRedirect redirectMapping = null;

            List <ItemRedirect> .Enumerator enumerator = this.MappingsMap.GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    ItemRedirect current = enumerator.Current;
                    if (itemId == current.Source)
                    {
                        redirectMapping = current;
                        return(redirectMapping);
                    }
                }
            }
            finally
            {
                ((IDisposable)enumerator).Dispose();
            }
            return(redirectMapping);
        }