以服务的方式提供站点基础功能支持

Web站点除了提供内容展示,业务逻辑处理外,还有很多看不到的操作,如:错误日志,后台管理,权限分配,访问统计等。如果只有一个站点,完全可以根据需要逐步添加,但实际的情况是往往有多个子站点,这时这些重复的功能就可以以服务的方式提供了。

举个例子,我们需要统计执行慢的页面列表,简单的做法是:
1 在Global.asax 的 BeginRequest, EndRequest事件中记录执行时间,如果超过某个值,如2秒,就记录到数据库。
2 在后台管理增加 slowpage_list.aspx 页面用于查看执行慢的页面列表。

基本实现还是蛮简单的,如:

[Global.asax]

<%@ Application Language="C#" %>
<script runat="server">
     
protected void Application_BeginRequest(object sender, EventArgs e) {
        
// 记录开始时间
        this.Context.Items["page_request_starttime"= DateTime.Now;
    }

    
protected void Application_EndRequest(object sender, EventArgs e) {
       
// 最大用时,单位毫秒,根据需要指定多慢的页面需要记录
        const int maxTimeUse = 2000;
        
string url = HttpContext.Current.Request.Url.ToString();

        
// 页面处理用时
        int timeUse = (int)(DateTime.Now - (DateTime)this.Context.Items["page_request_starttime"]).TotalMilliseconds;

        
// 如果执行时间超过最大用时
        if (timeUse > maxTimeUse) {
            
// 记录执行慢的页面
            AddSlowPage(url, timeUse);
        }
    }
</script>

以及:
[slowpage_list.aspx]

代码略 ......

这样做的缺点是,各个站点只能以拷贝的方式重用slow_page_list.aspx,以及还要重复数据库建表等。

改进的做法是:
增加一个 service.yousite.com 公用服务站点,各个子站点有执行慢的页面时,往这个公用服务站点提交。

if (timeUse > maxTimeUse) {
   
// 当前站点标识
    string site = "site001";
    
string address = string.Format("http://service.yousite.com/add_slowpage.ashx?site={0}&timeUse={1}&url={2}",
                                    site, timeUse, url);
    
    
// 指定超时时间,并用异步方式提交执行慢的页面地址
    System.Net.HttpWebRequest client = System.Net.WebRequest.Create(address) as System.Net.HttpWebRequest;
    client.Timeout 
= 2000;
    client.ReadWriteTimeout 
= 2000;
    client.BeginGetResponse(
nullnull);
}

然后在 service 站点,提供查看的页面,根据site参数来查看指定站点的slow page。
http://service.yousite.com/slowpage_list.aspx?site=site001

同时这个页面可以很方便的以iframe的方式嵌入到各个子站点的后台。

就像开发时,要DRY(Don't Repeat Yourself)避免重复代码一样,在规划站点时,也要避免重复的基础功能建设,这样的好处不光是减少工作量,也能够更好的保证整体站点的一致与稳定。

posted on 2011-05-12 14:02 ji yang 阅读(...) 评论(...) 编辑 收藏

导航

公告

统计