正在将global.asax迁移到ASP.NET 5

本文关键字:ASP NET 迁移 asax global | 更新日期: 2023-09-27 18:23:53

几天前,.NET Core RC1发布了,在读了很多关于它的文章后,我第一次尝试了一下,我喜欢它,但它有点不同。我正在尝试将一个小博客(在MVC5中构建)迁移到MVC 6&NET核心。这并不难,但我真的很难重新创建与MVC 5中完全相同的global.asax设置,ASP.NET 5不再有global.asak,所以我不知道大多数设置的替代品是什么?

    protected void Application_Start()
    {
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine());
        MvcHandler.DisableMvcResponseHeader = true;
        AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
    protected void Application_BeginRequest()
    {
        Response.AddHeader("X-Frame-Options", "DENY");
    }
    protected void Application_EndRequest()
    {
        if (Response.StatusCode != 301 && Response.StatusCode != 302) return;
        var targetUrl = Response.RedirectLocation.Replace("ReturnUrl", "url");
        Response.RedirectLocation = targetUrl;
    }
    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        string typeName;
        byte userType = (byte)(Context.Request.IsAuthenticated ? byte.Parse(User.Identity.Name.Split('|')[2]) : 1);
        switch (userType)
        {
            case 1: { typeName = "Client"; break; }
            case 2: { typeName = "Admin"; break; }
            default: { typeName = "Client"; break; }
        }
        var roles = new[] { typeName };
        if (Context.User != null)
        {
            Context.User = new GenericPrincipal(Context.User.Identity, roles);
        }
    }
    private void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        if (ex is HttpAntiForgeryException)
        {
            Response.Clear();
            Server.ClearError();
            Response.Redirect("/error/cookie", true);
        }
    }

请问,有没有一种方法可以让上面的代码在MVC 6中工作而不留下任何设置?这对我来说是个坏主意,谢谢。

正在将global.asax迁移到ASP.NET 5

即使是一个老问题,我也会提出这个问题,因为我已经看到,没有人介绍如何将global.asax方法迁移到Startup.cs在启动文件的Configure部分,您只需要添加

 app.Use(async (context, next) =>
                {       
                 //this will be call each request.
                 //Add headers      
                    context.Response.Headers.Add();
                 //check response status code
                  if(context.Response.StatusCode == 404) //do something
                 //check user
                 context.User.Identity.IsAuthenticated 
                //redirect
                 context.Request.Path = "some url"
                 await next() // will call next logic, in case here would be your controller.
                });

这不是一个有效的解决方案,这只是为了展示如何使用中间件并为每个请求应用逻辑。

希望能有所帮助。

要替换Application_Start,请将初始化代码放在Startup类中。

Application_BeginRequestApplication_EndRequestApplication_AuthenticateRequestApplication_Error可以用中间件代替(global.asaxHTTP Module,被middleware代替)

关于Application_AuthenticateRequest,您还应该阅读关于请求功能的文档

根据来自Shawn Wildermuth和他大约一周前在Pluralsight上举行了网络研讨会,他在会上表示MVC 5 global.asax、packages.config和web.config在ASP 5中已经不见了。因此,在ASP 5中,来自前MVC 5 global.asax的所有配置都将进入新的rootStartup.cs文件。