URL Rewrite

using System;
using System.IO;
using System.Threading;
using System.Web;

using Com.Website.Configuration;
using Com.Website.WebModel.Resource;
using Com.Website.DomainModel;

namespace Com.Website.HttpModule.UrlRewriter
{
    /// <summary>
    /// Url rewrite http module
    /// </summary>
    public class UrlRewriteHttpModule : IHttpModule
    {
        private UrlHelper urlHelper;
        private RewriteRuleCollection rewriteRuleList = new RewriteRuleCollection();

        public UrlRewriteHttpModule()
        {
            this.urlHelper = new UrlHelper();
        }

        #region IHttpModule Members

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(OnBeginRequest);
        }

        public void Dispose()
        {

        }

        #endregion

        private void InitialSetting()
        {
            rewriteRuleList.Clear();
            foreach (RewriteSetting rewriteSetting in ConfigurationManager.UrlRewriterConfiguration.RewriteConfiguration.RewriteSettingCollection)
            {
                RewriteRule rewrite = null;
                string providerName = rewriteSetting.Provider;
                if (string.IsNullOrEmpty(providerName))
                {
                    rewrite = UrlRewrite.CreateRewriteRule();
                }
                else
                {
                    rewrite = UrlRewrite.CreateRewriteRule(providerName);
                }
                rewrite.Initialize(rewriteSetting);
                rewriteRuleList.Add(rewrite);
            }
        }

        private void OnBeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;

            if (File.Exists(application.Request.PhysicalPath)) return;

            if (!(ConfigurationManager.BizConfiguration != null 
                    && ConfigurationManager.UrlRewriterConfiguration != null
                    && ConfigurationManager.UrlRewriterConfiguration.RewriteConfiguration != null
                    && ConfigurationManager.UrlRewriterConfiguration.RewriteConfiguration.RewriteSettingCollection != null))
                return;

            string pageName = string.Empty;
            if (HttpContext.Current != null && 
                HttpContext.Current.Request != null &&
                HttpContext.Current.Request.Url != null)
            {
                pageName = HttpContext.Current.Request.Url.AbsolutePath;
            }
            PageUrlAlias currentAlias = PageUrlAlias.InvalidUrl;
            if (!string.IsNullOrWhiteSpace(pageName))
            {
                currentAlias = ConfigurationManager.WebPageConfiguration.GetPageUrlAlias(pageName);
            }

            if (ConfigurationManager.UrlRewriterConfiguration.ExceptPage != null
                && ConfigurationManager.UrlRewriterConfiguration.ExceptPage.Pages != null
                && ConfigurationManager.UrlRewriterConfiguration.ExceptPage.Pages.Exists(d => d == currentAlias))
            {
                return;
            }

            InitialSetting();
            string requestUrl = application.Request.RawUrl;
            string requestQuerystring = string.Empty;
            string virtualUrl = requestUrl;
            int pos = requestUrl.IndexOf('?');
            if (pos >= 0)
            {
                requestQuerystring = requestUrl.Substring(pos + 1);
                virtualUrl = requestUrl.Substring(0, pos);
            }
            virtualUrl = virtualUrl.TrimEnd('/');

            RewriteRule rewriteRule = rewriteRuleList.Find(new Predicate<RewriteRule>(delegate(RewriteRule rule) { return rule.IsRewrite(virtualUrl); }));
            if (rewriteRule == null) return;

            string destinationUrl = rewriteRule.RewriteUrl(virtualUrl);
            destinationUrl = urlHelper.JoinUrlParameter(urlHelper.HandleRootOperator(destinationUrl), requestQuerystring);

            HttpContext.Current.RewritePath(destinationUrl);
        }
    }
}

 

posted @ 2014-02-25 19:50  fang_beny  阅读(263)  评论(0编辑  收藏  举报