将global.asax迁移到ASP.NET 5

14

几天前,.NET Core RC1发布了。在阅读了很多有关它的内容后,我第一次尝试使用它,我喜欢它,但它有点不同。我正在尝试将一个小博客(使用MVC5构建)迁移到MVC 6和.NET Core,这并不难,但我真的很难重新创建与MVC 5中完全相同的global.asax设置,因为ASP.NET 5不再有global.asax。所以我无法弄清楚大多数设置的替代方案是什么?

    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中工作?这对我来说是必须达成的条件,谢谢。


将这段代码放在 Github 存储库上,并在转换后与 MVC 6 项目并排展示,将是一项有趣的实验。如果您最终决定推送代码,请告诉我,我想看看它的样子以及移植所需的步骤。 - davidfowl
你可以通过使用自定义中间件来完成在global.aspx中所做的一切操作。在asp.net core中制作中间件也非常容易。http://andrewlock.net/adding-default-security-headers-in-asp-net-core/ - CRAIG ADAMS
3个回答

6

虽然这是一个老问题,但我还是想提出来,因为我发现没有人提供如何将global.asax中的方法迁移到Startup.cs的线索。 在Startup文件的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.
                });

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

希望能帮到您。


这段代码有点凌乱,但它确实捕获了所有请求。问题已解决,谢谢。 - alexb

4

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

Application_BeginRequestApplication_EndRequestApplication_AuthenticateRequestApplication_Error 可以被一个 中间件 替代(global.asax 是一个 HTTP 模块,已被 中间件 替代)。

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


1
我理解这一点,但我找不到任何好的教程来重新创建我需要的所有中间件。我只是感到沮丧,因为ASP.NET团队会做出如此重大的更改,却没有提供清晰的文档替代方案。 - Cindro
我相信他们会的。给他们一些时间。每个人都在忙着解决 Github 上的问题。虽然它已经可以用于生产环境,但它还没有发布第一个稳定版本。 - Dealdiane
@Cindro,doc中有一个示例,还可以查看Request feature doc,这将有助于替换Application_AuthenticateRequest - agua from mars

2
根据Shawn Wildermuth的博客文章和他在Pluralsight上的网络研讨会,他告诉我们,在ASP 5中,MVC 5的global.asax、packages.config和web.config都被删除了。因此,在ASP 5中,所有来自原先MVC 5 global.asax的配置都转移到了新的根目录Startup.cs文件中。

1
我理解,但是我该如何成功地将所有上面的代码移动到Startup.cs中?我只能够移动路由。 - Cindro
很抱歉,@Cindro,这不是一个容易的问题,因为事情已经发生了很大变化,所以我不知道,对不起。例如,捆绑几乎完全改变了:请参阅此文章http://www.jeffreyfritz.com/2015/05/where-did-my-asp-net-bundles-go-in-asp-net-5/。像global.asax、packages.config和web.config一样,许多在MVC 5中消失的东西也是如此。因此,您很可能需要用新代码替换大部分代码。 - user2771704
我知道,希望解决方案/替代方法很快就会发布。顺便说一下,在ASP.NET 5中打包,您可以使用此软件包进行打包,就像在4.5中一样:https://github.com/Shazwazza/Smidge - Cindro
@Cindro 谢谢。我会尝试的。 - user2771704

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接