Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
82 / 9 / 1
Регистрация: 24.05.2010
Сообщений: 555
1

Почему AuthorizeAttribute каждый раз вызывается дважды?

07.06.2018, 10:37. Просмотров 916. Ответов 7
Метки нет (Все метки)


Привет!

Есть свой класс, унаследованный от AuthorizeAttribute, в котором переопределен метод AuthorizeCore:

C#
1
2
3
4
5
6
7
8
9
public class AuthenticateAttribute : AuthorizeAttribute
{
    ...
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return true;
    }
    ...
}
Цепляю этот атрибут к контроллеру, ставлю точку останова на единственной строке метода и вижу, что с каждым запросом этот метод вызывается 2 раза. В стеке вызовов в этот момент этому вызову, в обоих случаях, предшествует [Внешний код].

Вопрос: почему этот метод вызывается 2 раза для каждого запроса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2018, 10:37
Ответы с готовыми решениями:

Почему метод выполняется дважды хотя один раз вызывается
Добрый день. В программе вызывается нек. метод, по событию изменение текста в сомбобоксе...

Почему виртуальный деструктор вызывается дважды?
Непонятно: #include <iostream> #include <conio.h> #include<string> using namespace std;...

Почему слот для QTextEdit::textChanged() вызывается дважды?
Заметил, что при удалении символа из виджета QTextEdit нажатием клавиш "Backspace" или "Delete"...

Почему функция вызывается один раз, а не бесконечное число раз
Программа показывает, как работать с анимацией цвета. Мы берём случайный цвет и медленно изменяем...

7
2258 / 1716 / 511
Регистрация: 02.08.2011
Сообщений: 4,902
07.06.2018, 22:57 2
Иногда это может говорить о том, что у вас невалидная разметка, i.e проблемы с синтаксисом в html коде (незакрытые теги и т.д.).
В таких случаях браузер может отправлять повторный запрос на сервер.
0
Футболист
526 / 428 / 142
Регистрация: 31.10.2011
Сообщений: 1,008
08.06.2018, 16:46 3
Открой fiddler и посмотри в чем дело.
Ты уверен что ты правильно его зарегал или в том что он не правильно себя ведет?
0
2426 / 1879 / 340
Регистрация: 22.07.2011
Сообщений: 7,194
08.06.2018, 21:04 4
Цитата Сообщение от IamRain Посмотреть сообщение
В таких случаях браузер может отправлять повторный запрос на сервер.
первый раз о таком слышу ) , браузеру пофиг на валидность , если он не определяет элемент как часть разметки , то просто проигнорирует его при построении структуры документа.

Цитата Сообщение от V0fka Посмотреть сообщение
Вопрос: почему этот метод вызывается 2 раза для каждого запроса?
начиная с того , что на стороне клиента дважды срабатывают скрипты на запрос , и заканчивая двойным обьявлением атрибута - например к методу и к классу , а может просто метод вызывается дважды. - в общем . ищите ошибки в коде.
0
2258 / 1716 / 511
Регистрация: 02.08.2011
Сообщений: 4,902
08.06.2018, 22:39 5
Цитата Сообщение от sau Посмотреть сообщение
первый раз о таком слышу )
Где-то на SO об этом читал, еще в теме времена, когда MVC был 4.0. Чесна чесна
0
82 / 9 / 1
Регистрация: 24.05.2010
Сообщений: 555
12.06.2018, 10:53  [ТС] 6
Вот контроллер, на котором я это проверяю:

C#
1
2
3
4
5
6
7
8
9
[Authenticate(UserRoles.Manager)]
public class ProfileController : Controller
{
    // GET: Profile
    public string Index()
    {
        return "OK";
    }
}
В классе атрибута оставил единственный метод AuthorizeCore(), который всегда возвращает true.

IamRain, разметки у меня как бы и нету. Но для эксперимента я создал представление

@{
Layout = null;
}

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>
и переделал действие:

C#
1
2
3
4
public ActionResult Index()
{
    return View();
}
Результат тот же.

Goal, Fiddler показывает 2 запроса:
1. GET /Profile HTTP/1.1
2. GET /favicon.ico HTTP/1.1

GoogleChrome показывает 1 запрос:
Request URL: http://localhost:62700/Profile
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:62700
Referrer Policy: no-referrer-when-downgrade
Запросы выполяются на первом обращении к AuthorizeCore()

Я свой атрибут нигде не регистрировал. Я его просто применяю к конкретному контроллеру. Я не понимаю почему он вызывается 2 раза. Правильно это или не правильно - я не знаю. Если это поведение правильное, то хотелось бы понять почему так происходит, потому что мне кажется, что так быть не должно.

sau, в коде вроде ничего нету. Самого кода практически нету.

Создал я новый проект, где определил такой же атрибут. Там метод AuthorizeCore() вызывается один раз.

Вот "проблемный" проект: https://dropmefiles.com/D8AN8
Там есть TestController, к которому применен атрибут. Если обратиться к этому контроллеру, то метод атрибута вызывается дважды. Если у кого-то будет время и желание посмотреть - буду благодарен.
0
82 / 9 / 1
Регистрация: 24.05.2010
Сообщений: 555
22.06.2018, 15:56  [ТС] 7
Актуально
Перезалил проект, старая ссылка умерла: https://www3.zippyshare.com/v/yMFfEzhZ/file.html

Добавлено через 31 секунду
Воспроизвести:
Там есть TestController, к которому применен атрибут. Если обратиться к этому контроллеру, то метод атрибута вызывается дважды.
Добавлено через 22 минуты
Нашел причину!

У меня в проекте используется библиотека Ninject. Вот есть такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace MVC_Application
{
    public class NinjectRegistrations : NinjectModule
    {
        public override void Load()
        {
 
        }
    }
 
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
 
            // внедрение зависимостей
            NinjectModule registrations = new NinjectRegistrations();
            var kernel = new StandardKernel(registrations);
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }
    }
}
Так вот если убрать строки

C#
1
2
3
NinjectModule registrations = new NinjectRegistrations();
var kernel = new StandardKernel(registrations);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
то атрибут вызывается один раз для запроса. То есть это Ninject почему-то в какой-то момент дергает атрибут авторизации.

Как это исправить?
0
82 / 9 / 1
Регистрация: 24.05.2010
Сообщений: 555
25.06.2018, 17:54  [ТС] 8
Короче говоря, взял вместо Ninject-а Autofac. С ним все работает нормально.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2018, 17:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

HTTP request. Почему data вызывается несколько раз?
Часть кода const http = require('https'); let reqOptions = { host:...

Почему дважды вызванный рандомный метод дважды рандомит одинаково?
Взгляните, есть метод рандомной генерации матрицы. Мы его дважды вызываем, и дважды получаем одну и...

OnCreate вызывается дважды
Добрый день. Делаю простое приложение, которое при нажатии на кнопку, с помощью Intent должно...

MsgBox вызывается дважды
Доброго времени суток. У Меня такая проблема, MsgBox вызывается почему-то дважды, Я не могу понять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.