在管理ASP.NET网站的时候,有时会对网站整体做出控制,这时把这些代码写在global.asax内可以做到全局控制。

未添加任何代码的global.asax文件如下:

<script runat="server">

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码

}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码

}

void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码

}

void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码

}

void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不引发该事件。

}

</script>

假设,我们要做网站安全处理,禁止客户端访问网站的某些目录,比如日志目录,上传文件目录等。

在global文件里,重写一下Inti() 方法,然后在Init()方法里注册一个处理禁止访问目录的事件,代码如下

public override void Init()
{
base.BeginRequest += BeginRequestEventHandler;
}
/// <summary>
/// 访问检测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void BeginRequestEventHandler(object sender, EventArgs e)
{

//新写一个处理类,不要把global文件弄得很乱
GlobalCheck globalCheck = new GlobalCheck();
globalCheck.RequestLogCheck(sender);
}

////////////////////////////////////////////////////////////////////处理类代码如下

public class GlobalCheck
{
/// <summary>
/// 检测是否访问了日志目录
/// </summary>
/// <param name="sender"></param>
public void RequestLogCheck(object sender)
{
HttpApplication app = sender as HttpApplication;
var requset = app.Context.Request;
string[] reqURL = requset.Url.AbsolutePath.Split('/');

List<string> forbidden = ForbiddenDir();
foreach (string item in reqURL)
{
if (forbidden.Contains(item))
{
app.Response.StatusCode = 404;//HTTP状态码标记为404
app.Response.End();
break;
}
}
}

/// <summary>
/// 文件上传检测
/// </summary>
public void RequestFileCheck(object sender)
{
HttpApplication application = sender as HttpApplication;

string AllowFileExten = "jpg|jpeg|ico|icon|png|gif|bmp|rar|zip|7z|doc|docx|xls|xlsx";
List<string> AllowFileList = new List<string>();
foreach (string item in AllowFileExten.Split('|'))
{
AllowFileList.Add(item);
}

HttpFileCollection HFC = application.Request.Files;
if (HFC.Count > 0)
{
for (int i = 0; i < HFC.Count; i++)
{
HttpPostedFile tempFile = HFC[i];

string fileName = tempFile.FileName;
string MIME = tempFile.ContentType;

string fileExt = System.IO.Path.GetExtension(fileName).ToLower().TrimStart('.');
if (!AllowFileList.Contains(fileExt))
{
application.Response.Status = "403 Forbidden";
application.Response.StatusCode = 403;
application.Response.End();
}
}
}
}

/// <summary>
/// 禁止访问目录列表
/// </summary>
/// <returns></returns>
private List<string> ForbiddenDir()
{
List<string> list = new List<string>();
list.Add("Log");

return list;

}

}

asp.net网站全局控制文件内注册事件的更多相关文章

  1. ASP.NET 网站在域环境内配置授权访问

    在 IIS 中,通常需要配置域中的某些用户或者用户组有权限访问部署的 WEB 站点或者 WEB 服务.我们知道要实现这种功能可以有如下几种方式: 代码,获取当前用户,到域服务器上去验证当前用户是否为合 ...

  2. asp.net网站中增删文件夹会导致Session或cache等等丢失

    因为这会导致网站资源本身重新加载. 如果要改变文件和文件夹,一般应该是对 app_data 下进行操作.

  3. 关于ASP.NET 中 Global.asax 文件的后台事件处理程序

    Global.asax.cs中的事件处理程序,像 Application_Start.Application_Error 等,这些名称和事件都是怎么来的呢? MSDN上的这篇文章描述了相关的内容: h ...

  4. 实现对ASP.NETMvc及Asp.NetCore的权限控制

    AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...

  5. Day10文件内指针移动和函数

    强调:只有t模式下的read(n),n代表字符个数,除此以外都是以字节为单位 ,例如f.read(4)读出4个字符 控制文件内指针的移动:f.seek()以字节为单位 f.tell()文件开头为准,当 ...

  6. 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

     [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  7. Oracle 无备份情况下的恢复--控制文件/数据文件

    13.3无备份恢复控制文件 没有备份恢复控制文件其实就是在nomount状态,create control创建一个新的控制文件. dba必须知道4个信息才能正确的创建:数据库名.在线日志路径及其大小. ...

  8. JS——行内式注册事件

    html中行内调用function的时候,是通过window调用的function,所以打印this等于打印window,所以在使用行内注册事件时务必传入参数this <!DOCTYPE htm ...

  9. ASP.NET应用程序和ASP.NET网站所共有的文件: App_Browsers 等

    App_Browsers  包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏览器定义文件架构(browsers 元素)和如何:在 A ...

随机推荐

  1. 白帽子讲web安全——白帽子兵法(设计安全方案中的技巧)

    1.Secure By Default原则 白名单:筛选出被允许的,屏蔽其他. 黑名单:屏蔽可能造成的威胁. 2.XSS和SSH XSS攻击:跨站脚本(cross site script)攻击是指恶意 ...

  2. 【thrift】什么是rpc

  3. Packer 基本试用

    安装 使用mac 系统 https://www.packer.io/downloads.html 配置环境变量 可选 sudo nano ~/.bash_profile export PATH=$PA ...

  4. 【转】嵌入式Linux启动配置文件及脚本

    原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202497 使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式L ...

  5. asm335x系列adc和触摸屏驱动(转)

    An analog-to-digital converter (abbreviated ADC) is a device that uses sampling to convert a continu ...

  6. 3.Appium运行时出现:Original error: Android devices must be of API level 17 or higher. Please change your device to Selendroid or upgrade Android on your device

    参考博客:https://blog.csdn.net/niubitianping/article/details/52624417 1.错误信息:Original error: Android dev ...

  7. LogHelp 日记分天记录,只记30天日记

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  8. Think in java.chm 第14章 多线程

    例子1引入线程概念通过得到当前线程方式循环主线程做某事 例子2演示了在主线程之外开启多个线程的基本方式 ( new一个extends Thread ) 例子3 ( task extends Threa ...

  9. Repeater更具条件为每行数据背景填充颜色

    后台代码 protected void RptPosterManager_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.I ...

  10. 5月23日笔记-js绑定事件、解绑事件、复合事件

    each() $("p").each(function(i,ele){ //alert(ele.innerHTML); alert($("p:eq("+i+&q ...