У меня есть ASP. net приложение веб-форм, которое интегрируется с определенным платежным шлюзом. После того, как платежный шлюз делает свои воли c, он отправляет ответ обратно на мой сайт на специальной веб-странице. Страница принимает данные обратной передачи и сохраняет их в базе данных.
Очень простой процесс, который работал безупречно, пока Google не выпустил браузер Chrome v80. Затем в некоторых случаях, не всегда, только в этих новых версиях Chrome некоторые запросы обратной передачи от платежного шлюза начали давать сбой. Все остальные браузеры по-прежнему работают нормально, даже более старые версии Chrome.
Я подозревал, что проблема в файлах cookie и что новое правило SameSite, введенное Google в этой новой версии Chrome. Я читал об этой проблеме и о том, что нужно сделать, чтобы мое приложение поддерживало эти изменения Google, но кажется, что проблема не относится к моей проблеме, потому что в большинстве случаев обратные передачи работают нормально. В любом случае я потратил некоторое время на то, чтобы поиграть с ним, я даже обновил свой веб до. net Framework 4.8, но это не помогло.
Анализируя журналы ошибок, я заметил, что в постбэке нет содержимого платежный шлюз отправлен обратно на мой сайт. В ходе судебной экспертизы я внедрил все обработчики событий, связанных с запросами, в global.asax на своем веб-сайте, чтобы отслеживать, что происходит с запросами. И то, что я нашел, запутало меня еще больше.
Обычно для всех допустимых запросов обратной передачи первым инициируемым событием всегда является BeginRequest, а остальные следуют, заканчиваясь следующими тремя событиями:
- EndRequest
- PreSendRequestHeaders
- PreSendRequestContent
Но, в случае неудачных обратных передач, BeginRequest не является первым запущенным событием. Это EndRequest, за которым следуют два других события, упомянутых выше. Эти три события имеют доступ к правильному контенту обратной передачи. После этих трех событий запускается BeginRequest и все события, которые должны go после него. Но начиная с BeginRequest, нет запроса контента. Похоже, что содержимое запроса сбрасывается или удаляется после этих первых трех событий, и новый HTTPRequest (или даже HTTPContext) инициализируется, но без содержимого.
Я действительно не понимаю, что происходит и в В течение недели я не мог найти ничего, связанного с моей проблемой. Я попробовал всевозможные трюки, чтобы попытаться перенести контент обратной передачи из первых трех событий в следующий BeginRequest, но безуспешно.
Это то, что я обнаружил до сих пор:
- допустимая обратная передача начинается с события BeginRequest
- недействительная обратная передача начинается с события EndRequest
- для допустимые обратные передачи, сеансовый повар ie и все другие файлы cookie доступны
- для неудачных обратных передач, сеансовый повар ie и большинство других файлов cookie недоступны в первых трех событиях (пахнет как Проблема SameSite?), Но они доступны позже в остальных событиях
- в неудачной обратной передаче, после первых трех событий, коллекция элементов HTTPContext и локальные переменные в global.asax сбрасываются
Меня смущают два факта:
- Проблема, очевидно, связана с тем, что Google сделал с Chrome в последней версии, но почему это происходит так непоследовательно? Было бы очевидно, что с моим приложением что-то не так, если оно всегда будет сбоить.
- Какого черта происходит с ASP. net событиями обработки запросов в global.asax? Как это возможно, что первым событием является EndRequest? Я никогда не видел такого поведения раньше.
Любой совет, намек или pu sh в правильном направлении приветствуется. Может быть, я не вижу ничего очевидного, поэтому, пожалуйста, помогите мне увидеть это. Если в моем описании есть что-то неясное, сообщите мне, чтобы я попытался уточнить это.
РЕДАКТИРОВАНИЕ: После дополнительных исследований (читай в поисках) и тестирования я смог решить вторую проблему - сначала вызвало событие EndRequest. EndRequest запускается первым, если необработанное исключение возникает до того, как сработало событие BeginRequest. В моем случае это было исключение в одном из модулей HTTP. После устранения причины исключения больше не было проблем с событием EndRequest.
Но теперь я решаю проблему с отсутствующими cookie-файлами в неудавшихся запросах, что, вероятно, является результатом неправильного определения ie cook (SameSite = None, Secure не применяется правильно). В производственной среде файлы cookie отклоняются, когда отправка поступает из платежного шлюза. Он работает нормально на сайте разработчика, но не в производстве.