Перенос global.asax в ASP.NET 5

Несколько дней назад .NET Core RC1 был выпущен, и я впервые прочитал его, прочитав много о нем, мне это нравится, но он немного отличается. Я пытаюсь перенести небольшой блог (встроенный в MVC5) в MVC 6 и .NET Core. Это было не сложно, но я действительно пытаюсь воссоздать те же самые параметры global.asax, которые у меня были в MVC 5, у 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 без каких-либо настроек? Это для меня прерыватель сделки, СПАСИБО.

Ответ 1

Чтобы заменить Application_Start, введите свой код инициализации в свой класс Startup.

Application_BeginRequest, Application_EndRequest, Application_AuthenticateRequest и Application_Error можно заменить на middleware (global.asax is a HTTP Module, которые были заменены на middleware)

Относительно Application_AuthenticateRequest вы также должны прочитать документ о Запросить функции

Ответ 2

Согласно этот blogpost от Shawn Wildermuth, а также он провел вебинар на Pluralsight около недели назад, где рассказал, что MVC 5 global.asax, packages.config и web.config ушли в ASP 5. Таким образом, в ASP 5 все конфигурации из прежнего MVC 5 global.asax переходит в новый файл root Startup.cs.

Ответ 3

Даже будучи старым вопросом, я поставил это, поскольку я видел, что никто не дает рекомендации о переносе методов 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.
                });

Это не рабочее решение, это просто показать, как работать с промежуточным программным обеспечением и применять логику для каждого запроса.

Надеюсь, что это поможет.