有时通过读书去学习,却发现不懂的更多,于是耐着心去读,不知不竟不知道在读些什么。
对于一个网站,更确切地说是对于一个浏览网页的用户而言,一切的开始大抵是在浏览器输入一个网址或点击一个链接,然后随着短暂的等待一切就看似结束了。当然,从输入地址到看到页面远非感观上这么简单,不去说网址到IP再到服务器,只简单说一说服务端是怎样找到浏览器请求的网页数据。
在最初接触静态页面时,我曾简单的以为,每当点击一个链接就是去根据地址去寻找到对应存储于服务器的一个页面。当接触了动态页面才知道一个网站的许多页面只是数据不同而非实际存在的页面,那些看上去不同的地址也只是因为服务端处理方式不同实际没什么不同。在过去一年多的工作中,我仅接触到一种处理流程。简单的讲就是根据网址中的域名来得到该网站在运营系统中的配置信息,根据网址中的路径找到对应的请求处理方法,两者结合生成浏览器请求的网页数据。
静态页面与动态页面的区别
一、得到运营系统中对应网站的配置信息:
以网站域名作为数据库中网站信息表的字段;
通过HttpContext对象获取域名以得到对应网站信息实体类;
// 获取当前请求的域名(仅适用于发布后)
string domainName = HttpContext.Current.Request.Url.DnsSafeHost;
// 根据网站域名得到网站ID(由于本地测试时无法通过HttpContext获取域名,故针对发布与本地给予两种处理方式均返回网站ID)
websiteId = WebsiteBiz.GetWebsiteIdByDomain(domainName);
- 根据网站信息实体类得到网站所用导航组ID;根据导航组ID得到导航信息及模板ID,依据导航信息生成网站对应导航信息;导航信息中包含对应的页面信息,可用以作为页面权限控制及简单安全验证。
至此,不仅得到了网站信息、对应导航及所包含的页面信息,同时由于数据皆从数据库中读取可实现信息的可配置与实时维护。
二、根据网址中的路径找到对应的请求处理方法:
以页面编号(页面编号即为访问路径中的页面名称)作为数据库中页面信息表的主键ID;
通过HttpContext对象获取访问页面编号或根据HttpGet提供的参数得到页面编号以得到对应页面信息实体类,根据对应的页面信息实体类得到页面相关的数据,如页面名称、所用母版页、所属网站等信息;
在当前访问中可依据当前页面信息实体信息,在Action执行流程中进行安全检测、权限验证或记录访问信息等操作,其中CheckPermission()方法进行权限验证、GetInteractive()方法加载页面交互信息,下一篇将着重谈到。Action加载过程代码如下所示,当Action加载完毕则自动返回客户端请求的数据,一次用户访问结束:
#region << Action加载 >>
/// <summary>
/// 在进行授权时调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnAuthentication(AuthenticationContext filterContext)
{
// 检查权限
bool isHavePermission = CheckPermission();
if (isHavePermission)
{
base.OnAuthentication(filterContext);
}
}
/// <summary>
/// 在调用操作方法前调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
/// <summary>
/// 在调用操作方法后调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
/// <summary>
/// 在执行由操作方法返回的操作结果前调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
// UI交互信息
ViewBag.UI = GetInteractive();
base.OnResultExecuting(filterContext);
}
/// <summary>
/// 在执行由操作方法返回的操作结果后调用
/// </summary>
/// <param name="filterContext"></param>
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
#endregion
原文链接:一切开始的地方