在管理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. timescaledb 几个方便的api

    timescaledb 提供了内置的api 操作,方便我们进行操作控制 hypertable 控制api add_dimension 向hypertable添加一个额外的分片方式,可以做为分片列有时间 ...

  2. java的堆和栈

    初始入门嗯:https://www.cnblogs.com/SaraMoring/p/5687466.html 堆空间:new出来的数组和对象,对象和数组没有引用指向它的时候,等待下一次垃圾回收 栈空 ...

  3. C# Async&Await

    在async和await之前我们用Task来实现异步任务是这样做的: static Task<string> GetBaiduHtmlTAP() { //创建一个异步Task对象,内部封装 ...

  4. create index 与 alter table add index 区别

    众所周知,MySQL创建索引有两种语法,即:ALTER TABLE HeadOfState ADD INDEX (LastName, FirstName);CREATE INDEX index_nam ...

  5. win xp 环境变量PATH默认值

    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

  6. 把XML保存为ANSI编码

    XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlText); //plu.xml 编码是ANSI的.否则称上品名是乱码 XmlEle ...

  7. WinForm各浏览器内核控件

    WebKit.NET webkit-sharp CefSharp awesomium OpenWebKitSharp geckofx MozNet Web Component

  8. Python实现进度条总结

    先说一下文本系统的控制符:\r:   将光标移动到当前行的首位而不换行:\n:   将光标移动到下一行,并不移动到首位:\r\n: 将光标移动到下一行首位.     环境:root@ubuntu16: ...

  9. springboot 邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  10. C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)

    C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = n ...