如何通过OWIN实现global.asax事件 [英] How to implement global.asax events by OWIN

查看:115
本文介绍了如何通过OWIN实现global.asax事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在asp.net 6中将没有名为global.asax的文件,但是global.asax具有许多类似事件,例如

·Application_Init

·Application_Start

·Session_Start

·Application_BeginRequest

·Application_EndRequest

·Application_AuthenticateRequest

·Application_Error

·Session_End

·Application_End

例如,

例如,我经常使用Application_BeginRequest事件来重定向用户.这是示例代码

protected void Application_BeginRequest(Object sender, EventArgs e)
{
            if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=gm-mdi-diagnostic-tool"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/oem-diagnostic-tools/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=landrover_rover_t4_testbook_lite_diagnostic_tool_ids"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/shop/oem-diagnostic-tools/land-rover-t4-mobile/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=ford_ids_main_dealer_tool_mazda_jaguar_landrover"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/oem-diagnostic-tools/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content=coda_fuelling_tester_dynamically_measure_fuel_flow_and_pressure_in_situ_under_load"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/", true);
            }
}            

所以告诉我如何使用OWIN进行相同操作?与代码示例讨论.

还告诉我如何从OWIN class code捕获session start / end or application start or end吗?

请讨论谢谢

解决方案

如果您需要在每个请求之前执行一些自定义,我建议您使用标准方式:创建一个中间件并将其插入HTTP请求管道中. /p>

创建中间件的方法有很多,但是出于清晰度和可维护性的考虑,创建新类是一个不错的选择.这是一个例子:

public class MyMiddleware
{
  private readonly RequestDelegate next;

  public MyMiddleware(RequestDelegate next)
  {
    this.next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    this.BeginInvoke(context);
    await this.next.Invoke(context);
    this.EndInvoke(context);
  }

  private void BeginInvoke(HttpContext context)
  {
    // Do custom work before controller execution
  }

  private void EndInvoke(HttpContext context)
  {
    // Do custom work after controller execution
  }
}

接下来,仅需注册中间件.这是在Startup类的Configure方法中完成的:

public class Startup
{
  public void Configure(IApplicationBuilder app)
  {
    ...
    app.UseMiddleware<MyMiddleware>();
    ...
  }
}

仅此而已.忘了global.asax;-)

from asp.net 6 there would be no file called global.asax but global.asax has many events like

· Application_Init

· Application_Start

· Session_Start

· Application_BeginRequest

· Application_EndRequest

· Application_AuthenticateRequest

· Application_Error

· Session_End

· Application_End

say for example i often work with Application_BeginRequest event to redirect user. here is a sample code

protected void Application_BeginRequest(Object sender, EventArgs e)
{
            if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=gm-mdi-diagnostic-tool"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/oem-diagnostic-tools/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=landrover_rover_t4_testbook_lite_diagnostic_tool_ids"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/shop/oem-diagnostic-tools/land-rover-t4-mobile/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content.aspx?content=ford_ids_main_dealer_tool_mazda_jaguar_landrover"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/oem-diagnostic-tools/", true);
            }
            else if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("content=coda_fuelling_tester_dynamically_measure_fuel_flow_and_pressure_in_situ_under_load"))
            {
                Response.RedirectPermanent("http://shop.bba-reman.com/product-category/diagnostic-tools/", true);
            }
}            

so tell me how to do the same with OWIN ? discuss with code sample.

also tell me how to capture session start / end or application start or end from OWIN class code ?

please discuss thanks

解决方案

If you need to execute some custom before each request, I recommend you to use the standard way : create a middleware and insert it in the HTTP request pipeline.

There is many ways to create a middleware, but for clarity and maintainability, create a new class is a good choice. Here is an exemple :

public class MyMiddleware
{
  private readonly RequestDelegate next;

  public MyMiddleware(RequestDelegate next)
  {
    this.next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    this.BeginInvoke(context);
    await this.next.Invoke(context);
    this.EndInvoke(context);
  }

  private void BeginInvoke(HttpContext context)
  {
    // Do custom work before controller execution
  }

  private void EndInvoke(HttpContext context)
  {
    // Do custom work after controller execution
  }
}

Next it only remains to register the middleware. This is done in the Configure method of Startup class :

public class Startup
{
  public void Configure(IApplicationBuilder app)
  {
    ...
    app.UseMiddleware<MyMiddleware>();
    ...
  }
}

That's all. And forget global.asax ;-)

这篇关于如何通过OWIN实现global.asax事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆