在管理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. 【转】 python 删除非空文件夹

    转自:https://blog.csdn.net/xiaodongxiexie/article/details/77155864 一般删除文件时使用os库,然后利用os.remove(path)即可完 ...

  2. python print 控制台输出中文

    在pycharm里面的控制台用print输出信息,  本意想输出中文, 但是实际上是u\xxxx. 可以用这种方式: print("%s " % cn_string)

  3. C语言Socket编程(计算机网络作业)

    最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写C语言的代码,使用的计算就是Socket通信发送消息:代码实现的功能很简单,客户端向服务器端发送消息,服务器端接收客户端发来的消息,并且输出显 ...

  4. sublime text 3 配置优化

    1.在用Sublime里编写代码时,需要把TAB键转换成四个空格. 菜单栏里点击:首选项-> 设置-用户(Preferences-> Setting-User)在弹出来的文本里,添加如下两 ...

  5. linq to sql 怎么查询前 11 条数据

    (from 新表 in db.books where 新表.bookid < 400 select 新表).Take(11); storeDB.Albums.OrderByDescending( ...

  6. Quick guide for converting from JAGS or BUGS to NIMBLE

    Converting to NIMBLE from JAGS, OpenBUGS or WinBUGS NIMBLE is a hierarchical modeling package that u ...

  7. C# 如何捕获一个USB设备发送到PC的数据

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. PAT 甲级 1010 Radix (25)(25 分)进制匹配(听说要用二分,历经坎坷,终于AC)

    1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...

  9. PHP调用OCX控件的具体方法

    需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多, ...

  10. Waiting for device dev/disk/by-id/ata-...-part2 to appear

    问题: 平台:Oralce VM Virtualbox的虚拟机Opensuse11.4 导出该机器的OVA文件后,把该OVA文件导入虚拟机,开机启动时报如下错误: Trying manual resu ...