Response.Redirect не срабатывает из-за кода для предотвращения повторной отправки - PullRequest
0 голосов
/ 21 апреля 2010

У меня есть событие, которому необходимо связаться с некоторыми сторонними поставщиками перед выполнением перенаправления (например, «последняя страница оплаты на сайте электронной коммерции»), и, следовательно, с его обработкой связано некоторое отставание. Очень важно, чтобы с этими сторонними поставщиками не связывались более одного раза, и иногда нетерпеливые пользователи могут попытаться обновить страницу (следовательно, повторно отправив данные). Общая структура кода:

If Session("orderStatus") <> 'processing' Then

    Session("orderStatus") = 'processing'

    DoThirdPartyStuffThatTakesSomeTime()

    Response.Redirect("confirmationPage.asp", True)

End If

Проблема в том, что если пользователь обновляет страницу, response.redirect не происходит (даже если остальная часть кода будет запущена до перенаправления из исходной отправки). Кажется, что новая отправка создает новый поток для браузера, который имеет приоритет - он пропускает этот бит кода, очевидно, чтобы предотвратить повторный контакт со сторонними поставщиками, и, поскольку нет перенаправления, просто возвращается на ту же страницу , Вся вторая заявка может быть завершена до того, как первая заявка закончила свою работу.

Любая помощь в том, как я могу игнорировать все последующие представления страницы, но все равно заставить работать перенаправление ...?

Спасибо

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Переместить вас из структуры if:

If Session("orderStatus") <> 'processing' Then

  Session("orderStatus") = 'processing'

  DoThirdPartyStuffThatTakesSomeTime()

End If

Response.Redirect("confirmationPage.asp", True)
0 голосов
/ 23 апреля 2010

После нескольких дополнительных исследований (включая много отслеживания и отслеживания того, что запускалось, и при использовании переменных сеанса) я обнаружил, что ASP.NET автоматически сериализует запросы для данного сеанса, так что каждый из них будет выполняться по очереди. Однако (и это меня смутило), «Ответ», доставленный в браузер, является результатом последнего выполненного действия (при условии, что это действие было инициировано до того, как браузер получил ответ на предыдущее действие). Итак, в моем случае выше, весь сторонний код, инициированный первым запросом, завершает выполнение до того, как второй запрос даже начнется. Когда все запросы завершают обработку, ASP.NET, очевидно, доставляет HTML обратно из последнего запроса в IIS (что оказалось просто обновлением страницы).

Итак, первое предложение Одеда о переносе перенаправления выше было правильным - и я пометил это ответом.

...