需求:

在Aps.Net 应用中,对于浏览器请求的部分url的地址自定义处理,不交给路由系统或页面。

解决方案:

在全局文件Global.asax中 ,提供Application_BeginRequest 事件,这个事件可以监听到,本网站的所有请求都会经过这。此处根据url自定义输出响应内容,并结束响应就可以了。

自定义拦截请求示例1:

1.Global.asax 中代码处理

public class MvcApplication : System.Web.HttpApplication
{ LogHelper.LogHelper _log = new LogHelper.LogHelper();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
/// <summary>
/// 接收请求
/// </summary>
protected void Application_BeginRequest()
{
_log.WriteLine("请求地址:" + Request.Url.AbsoluteUri);
//拦截请求
string[] segments = Request.Url.Segments;
if (segments.Length > && segments[].ToLower() == "testone")
{
//需要自己指定输出内容和类型
Response.ContentType = "text/html;charset=utf-8";
Response.Write("请求拦截处理");
Response.End(); // 此处结束响应,就不会走路由系统
}
}
}

2.不拦截的默认Action 定义

public class TestOneController : Controller
{
// GET: TestOne
public ActionResult Index()
{
return Content("测试首页");
}
}

注:调试说明,如果指定Response.End() ,就不会走路由系统,执行Action。

自定义扩展模块拦截请求处理示例2

1.定义模块,继承IHttpModule

/// <summary>
/// 定时任务常用逻辑封装
/// 注:每天指定小时内循环触发,原因,保证这个小时中程序在运行或有一次访问,定时任务可以执行
/// </summary>
public class TimedTask:IHttpModule
{
/// <summary>
/// 需要全局对象,保证多线程参数统一
/// </summary>
public static TaskParams Params = new TaskParams();
/// <summary>
/// 标记已经运行
/// </summary>
public void SetRuned()
{
Params.Hour_State = true;
}
/// <summary>
/// 任务对象
/// </summary>
private static Task _Task = null; /// <summary>
/// 执行事件处理
/// </summary>
public Action OnRunning = null;
/// <summary>
/// 执行异常
/// </summary>
public Action<Exception> OnError = null; /// <summary>
/// 监听请求处理
/// </summary>
private void Init()
{ }
/// <summary>
/// 开启监听处理
/// </summary>
public void Start()
{
if (_Task != null)
{
//if (_Task.Status != TaskStatus.Running)
//{
// _Task.RunSynchronously();
//}
return;
} //开启定时任务
_Task = new Task(() =>
{
while (true)
{
try
{
//判断达到对应小时执行
if (DateTime.Now.Hour == Params.TaskHour)
{
//外部处理,具体内容
OnRunning?.Invoke();
}
else
{
Params.Hour_State = false;
}
}
catch (Exception ex)
{
Params.error_state = ;
Params.error_msg = ex.Message;
OnError?.Invoke(ex);
}
//等待处理
Thread.Sleep(Params.SleepSpan);
}
});
_Task.Start();
} public void Init(HttpApplication app)
{
//请求监听处理
app.BeginRequest += (object sender, EventArgs e) =>
{
HttpResponse resp = app.Response;
HttpRequest req = app.Request;
if (req.HttpMethod == "GET")
{
//拦截请求
string[] segments = req.Url.Segments;
if (segments.Length > && segments[].ToLower() == "gettaskinfo")
{
if (_Task == null)
throw new Exception("当前定时任务对象没有初始化");
JObject obj = JObject.FromObject(_Task);
//合并参数
obj.Merge(JObject.FromObject(Params));
resp.Write(obj.ToString());
resp.ContentType = "application/json;charset=utf-8";
resp.End();
}
}
};
} public void Dispose()
{
throw new NotImplementedException();
}
}
/// <summary>
/// 定时任务的参数定义
/// </summary>
public class TaskParams
{
/// <summary>
/// 定时任务每天运行的时间点
/// </summary>
public int TaskHour { get; set; } = ;
/// <summary>
/// 间隔执行的时间段,单位/毫秒,默认6分钟一次执行
/// </summary>
public int SleepSpan { get; set; } = * * ; /// <summary>
/// 判断当前小时是否已经执行,每次执行完任务标记为true
/// </summary>
public bool Hour_State { get; set; }
/// <summary>
/// 判断异常状态
/// </summary>
public int error_state;
/// <summary>
/// 异常消息内容
/// </summary>
public string error_msg; }

2.注册启动模块

在AssemblyInfo程序加载文件定义:

//定义程序启动时处理方法
[assembly: PreApplicationStartMethod(typeof(TestOne), "Start")]

在启动方法中,注册模块和启用定时任务,关于启动方法:http://www.cnblogs.com/tianma3798/p/8251858.html

public class TestOne
{
/// <summary>
/// 程序启动时,PreApplicationStartMethod中指定的方法必须是公共静态的
/// </summary>
public static void Start()
{
LogHelper.LogHelper _log = new LogHelper.LogHelper();
_log.WriteLine("程序启动成功1"); //启用定时任务
TimedTask _task = new TimedTask();
//指定运行的小时点
TimedTask.Params.TaskHour = DateTime.Now.Hour;
TimedTask.Params.SleepSpan = * ;
_task.OnRunning += () =>
{
_task.SetRuned();
_log.WriteLine("定时任务已经执行");
};
_task.OnError += (ex) =>
{
_log.WriteLine("定时任务执行失败:" + ex.Message);
};
_task.Start();
HttpApplication.RegisterModule(typeof(TimedTask));
}
}

更多:

Asp.Net HttpApplication 事件汇总

Asp.Net HttpApplication请求管道与Session(一)

Asp.Net HttpApplication请求管道与Session(二)

Asp.Net 拦截请求自定义处理的更多相关文章

  1. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  2. CefSharp请求资源拦截及自定义处理

    CefSharp请求资源拦截及自定义处理 前言 在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理. 什么是资源 ...

  3. asp.net 客户端请求到响应的整个过程

    出处:https://www.cnblogs.com/Joans/archive/2012/02/08/2342887.html 疑惑?从客户端发出一个请求,请求到达服务端如何和IIS关联起来?IIS ...

  4. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

  5. 转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    [译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链   你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你 ...

  6. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  7. .net core MVC 通过 Filters 过滤器拦截请求及响应内容

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: Swashbuckle.AspNetCore 我暂时用的是 ...

  8. ASP模拟POST请求异步提交数据的方法

    这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...

  9. ASP.NET获取请求的url信息汇总

    ASP.NET获取请求的url信息汇总 最近做项目需要处理一个用代码获取当前网站的域名或ip信息的问题,于是尝试了ASP.NET中各种获取url信息的方法,在此总结一下: 在Global.asax文件 ...

随机推荐

  1. 记2013年度成都MVP社区巡讲

    上个周六在天府软件园A区的翼起来咖啡举行了MVP社区巡讲成都站的活动,这个巡讲活动去年也搞过一次. MVP社区巡讲是 @微软中国MVP项目组 支持的,由各地的MVP担任讲师,给本地技术社区提供的一种社 ...

  2. C++Primer,C++标准IO库阅读心得

    IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...

  3. 000 SpringMVC介绍

    1.介绍 2.MVC 模型(Model)封装了应用程序数据,通常它们将由POJO类组成. 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出. 控制器(Controlle ...

  4. 自然语言处理---用隐马尔科夫模型(HMM)实现词性标注---1998年1月份人民日报语料---learn---test---evaluation---Demo---java实现

    先放上一张Demo的测试图 测试的句子及每个分词的词性标注为:   目前/t 这/rzv 条/q 高速公路/n 之间/f 的/ude1 路段/n 已/d 紧急/a 封闭/v ./w 需要基础知识 HM ...

  5. Spring Security + JWT实现前后端分离权限认证

    现在国内前后端很多公司都在使用前后端分离的开发方式,虽然也有很多人并不赞同前后端分离,比如以下这篇博客就很有意思: https://www.aliyun.com/jiaocheng/650661.ht ...

  6. ARP欺骗防御工具arpon

    ARP欺骗防御工具arpon   ARP欺骗是局域网最为常见的中人间攻击实施方式.Kali Linux提供一款专用防御工具arpon.该工具提供三种防御方式,如静态ARP防御SARPI.动态ARP防御 ...

  7. BZOJ2090 : [Poi2010]Monotonicity 2

    设f[i]表示以i为结尾的最长的合法序列的长度,=号直接维护,<号和>号用两棵树状数组维护即可,时间复杂度$O(n\log n)$. #include<cstdio> #def ...

  8. xcode 拷贝新的ios image 进去以后 出现 the divices is locked

    苹果公司时不时的给你更新下ios系统.对于开发者来说.更新xcode是灾难性的. 一直在用xcode7.3.1,可是最新不小心把手机升级到 ios 10.1.1,这下好了,真机调试不行了.提示没有镜像 ...

  9. FireDAC 下的 Sqlite [3] - 获取数据库的基本信息

    在空白窗体上添加: TFDConnection, TFDPhysSQLiteDriverLink, TFDGUIxWaitCursor, TMemo procedure TForm1.FormCrea ...

  10. jquery-chosen设置默认值

    <span style="font-size:18px;"> <select id="select1" class="select1 ...