У нас есть требование принять форму и сохранить некоторые данные, а затем перенаправить пользователя на страницу вне сайта, но при перенаправлении нам нужно «отправить» форму с помощью POST, а не GET.
Я надеялся, что есть простой способ сделать это, но я начинаю думать, что нет. Я думаю, что теперь я должен создать простую другую страницу с нужной мне формой, перенаправить на нее, заполнить переменные формы, а затем выполнить вызов body.onload для сценария, который просто вызывает document.forms [0] .submit ( );
Может кто-нибудь сказать мне, если есть альтернатива? Возможно, нам понадобится настроить это позже в проекте, и это может стать чем-то сложным, поэтому, если бы это было легко, мы могли бы сделать все это без постраничной зависимости, что было бы фантастически.
В любом случае, спасибо за любые ответы.
источник
Ответы:
Для этого необходимо понять, как работает перенаправление HTTP. Когда вы используете
Response.Redirect()
, вы отправляете ответ (браузеру, который сделал запрос) с HTTP Status Code 302 , который сообщает браузеру, куда идти дальше. По определению браузер сделает это с помощьюGET
запроса, даже если исходный запрос былPOST
.Другим вариантом является использование HTTP Status Code 307 , который указывает, что браузер должен сделать запрос на перенаправление таким же образом, как исходный запрос, но для предупреждения пользователя с предупреждением безопасности. Для этого вы должны написать что-то вроде этого:
К сожалению, это не всегда работает. Различные браузеры реализуют это по-разному , поскольку это не общий код состояния.
Итак, насколько я знаю, единственный способ реализовать что-то подобное - это использовать Javascript. Есть два варианта, которые я могу придумать вне головы:
action
укажите ее атрибут на стороннем сервере. Затем добавьте событие click к кнопке отправки, которая сначала выполняет запрос AJAX на ваш сервер с данными, а затем разрешает отправку формы на сторонний сервер.Из двух я бы выбрал второе по двум причинам. Во-первых, он более надежен, чем первый, потому что для его работы не требуется Javascript; для тех, у кого она не включена, вы всегда можете сделать видимой кнопку отправки для скрытой формы и дать им команду нажать ее, если это займет более 5 секунд. Во-вторых, вы можете решить, какие данные будут передаваться на сторонний сервер; если вы просто обрабатываете форму по мере ее поступления, вы будете передавать все почтовые данные, что не всегда то, что вы хотите. То же самое для решения 307, при условии, что оно работает для всех ваших пользователей.
Надеюсь это поможет!
источник
Вы можете использовать этот подход:
В результате сразу после того, как клиент получит все html с сервера, происходит событие загрузки, которое запускает отправку и отправку всех данных в определенный postbackUrl.
источник
HttpWebRequest используется для этого.
При обратной передаче создайте запрос HttpWebRequest для третьей стороны и опубликуйте данные формы, а затем, как только это будет сделано, вы можете Response.Redirect куда угодно.
Вы получаете дополнительное преимущество, заключающееся в том, что вам не нужно называть все свои элементы управления сервером для создания сторонней формы, вы можете выполнить этот перевод при построении строки POST.
Однако если вам нужно, чтобы пользователь увидел страницу ответа из этой формы, вы можете использовать только Server.Transfer, и это может работать, а может и не работать.
источник
Это должно сделать жизнь намного проще. Вы можете просто использовать метод Response.RedirectWithData (...) в своем веб-приложении.
источник
Что-то новое в ASP.Net 3.5 - это свойство «PostBackUrl» кнопок ASP. Вы можете установить для него адрес страницы, на которую вы хотите отправить сообщение, и когда вы нажимаете эту кнопку, вместо того, чтобы отправлять обратно на ту же страницу, как обычно, она вместо этого отправляет на указанную вами страницу. Handy. Убедитесь, что UseSubmitBehavior также имеет значение TRUE.
источник
Я подумал, что было бы интересно поделиться тем, что heroku делает это с SSO для поставщиков дополнений
Пример того, как это работает, можно увидеть в исходном коде инструмента "kensa":
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
И это можно увидеть на практике, если вы включите JavaScript. Пример страницы источника:
источник
PostbackUrl может быть установлен на кнопку asp для публикации на другой странице.
если вам нужно сделать это в коде позади, попробуйте Server.Transfer.
источник
@ Matt,
Вы по-прежнему можете использовать HttpWebRequest, а затем направить полученный ответ на фактический ответ outputtream, который будет возвращать ответ пользователю. Единственная проблема заключается в том, что любые относительные URL будут нарушены.
Тем не менее, это может сработать.
источник
Вот что я бы сделал:
Поместите данные в стандартную форму (без атрибута runat = "server") и установите действие формы для публикации на целевой странице за пределами сайта. Перед отправкой я отправляю данные на свой сервер с помощью XmlHttpRequest и анализирую ответ. Если ответ означает, что вы должны продолжить удаленную POSTing, тогда я (JavaScript) продолжу публикацию, в противном случае я перенаправлю на страницу на моем сайте.
источник
Да, HttpWebRequest, см. Мой пост ниже.
источник
Метод GET (и HEAD) никогда не должен использоваться для выполнения каких-либо побочных эффектов. Побочным эффектом может быть обновление состояния веб-приложения или списание средств с вашей кредитной карты. Если у действия есть побочные эффекты, следует использовать другой метод (POST).
Таким образом, пользователь (или его браузер) не должен нести ответственность за то, что сделал GET. Если какой-либо вредный или дорогой побочный эффект возник в результате GET, то это будет вина веб-приложения, а не пользователя. Согласно спецификации, пользовательский агент не должен автоматически следовать перенаправлению, если он не является ответом на запрос GET или HEAD.
Конечно, многие запросы GET имеют некоторые побочные эффекты, даже если они просто добавляются в файл журнала. Важно то, что приложение, а не пользователь, должно нести ответственность за эти эффекты.
Соответствующими разделами спецификации HTTP являются 9.1.1 и 9.1.2 и 10.3 .
источник
Я предлагаю создать HttpWebRequest для программного выполнения вашего POST, а затем перенаправить после прочтения Ответа, если это применимо.
источник
Копируемый код, основанный на методе Павла Неймана
RedirectPost (string url, T bodyPayload) и GetPostData () предназначены для тех, кто просто хочет сбросить некоторые строго типизированные данные на исходной странице и извлечь их на целевой странице. Данные должны быть сериализуемыми в NewtonSoft Json.NET, и вам, конечно, нужно ссылаться на библиотеку.
Просто скопируйте и вставьте на свои страницы или, еще лучше, базовый класс для своих страниц и используйте его в любом месте своего приложения.
Я сердечно приветствую всех вас, кто по каким-либо причинам все еще должен использовать веб-формы в 2019 году.
источник
Как правило, все, что вам когда-либо понадобится, - это переносить некоторое состояние между этими двумя запросами. На самом деле есть действительно забавный способ сделать это, который не зависит от JavaScript (подумайте <noscript />).
Имея этот файл cookie, вы можете в следующем запросе к /redirect.html получить информацию об имени = значении, вы можете сохранить любую информацию в этой строке пары имя / значение, вплоть до 4 КБ данных (типичное ограничение для файлов cookie). Конечно, вы должны избегать этого и хранить вместо этого коды состояния и биты флага.
Получив этот запрос, вы в ответ отвечаете запросом на удаление этого кода состояния.
Мой HTTP немного ржавый. Я прошёл через RFC2109 и RFC2965, чтобы выяснить, насколько это действительно надежно, желательно, чтобы cookie отправлялся в оба конца ровно один раз, но это не представляется возможным, в том числе и сторонние файлы cookie. может быть проблемой для вас, если вы переезжаете в другой домен. Это все еще возможно, но не так безболезненно, как когда вы делаете что-то внутри своего домена.
Проблема здесь заключается в параллелизме, если опытный пользователь использует несколько вкладок и ему удается чередовать пару запросов, принадлежащих одному и тому же сеансу (это очень маловероятно, но не невозможно), это может привести к несоответствиям в вашем приложении.
Это способ <noscript /> выполнять обходы HTTP без бессмысленных URL и JavaScript
Я предоставляю этот код как основную идею: если этот код выполняется в контексте, с которым вы не знакомы, я думаю, вы сможете решить, что это за часть.
Идея заключается в том, что при перенаправлении вы вызываете Relocate с некоторым состоянием, а URL-адрес, по которому вы переместились, вызывает GetState для получения данных (если они есть).
источник