Перенос 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.
});
Это не рабочее решение, это просто показать, как работать с промежуточным программным обеспечением и применять логику для каждого запроса.
Надеюсь, что это поможет.