Wymagamy przesłania formularza i zapisania niektórych danych, a następnie przekierowania użytkownika na stronę poza witryną, ale w przypadku przekierowania musimy „przesłać” formularz za pomocą POST, a nie GET.
Miałem nadzieję, że można to łatwo osiągnąć, ale zaczynam myśleć, że nie ma. Myślę, że muszę teraz utworzyć prostą inną stronę, używając tylko żądanego formularza, przekierować do niego, wypełnić zmienne formularza, a następnie wykonać wywołanie body.onload do skryptu, który wywołuje tylko document.forms [0] .submit ( );
Czy ktoś może mi powiedzieć, czy istnieje alternatywa? Być może będziemy musieli dostosować to później w projekcie, a może to się skomplikować, więc gdyby istniała łatwa możliwość, moglibyśmy zrobić to wszystko zależnie od innych stron, co byłoby fantastyczne.
W każdym razie dzięki za wszelkie odpowiedzi.
źródło
Odpowiedzi:
Wykonanie tego wymaga zrozumienia, jak działają przekierowania HTTP. Gdy korzystasz
Response.Redirect()
, wysyłasz odpowiedź (do przeglądarki, która wysłała żądanie) z kodem stanu HTTP 302 , który informuje przeglądarkę, gdzie należy przejść dalej. Z definicji przeglądarka zrobi to za pośrednictwemGET
żądania, nawet jeśli pierwotne żądanie toPOST
.Inną opcją jest użycie kodu stanu HTTP 307 , który określa, że przeglądarka powinna wysłać żądanie przekierowania w taki sam sposób, jak żądanie oryginalne, ale poprosić użytkownika o ostrzeżenie bezpieczeństwa. Aby to zrobić, napiszesz coś takiego:
Niestety nie zawsze to działa. Różne przeglądarki implementują to inaczej , ponieważ nie jest to wspólny kod stanu.
Tak więc, o ile mi wiadomo, jedynym sposobem na wdrożenie czegoś takiego jest użycie Javascript. Są dwie opcje, które mogę wymyślić z góry głowy:
action
atrybut wskazywał na serwer innej firmy. Następnie dodaj zdarzenie kliknięcia do przycisku przesyłania, który najpierw wykonuje żądanie AJAX na serwerze z danymi, a następnie umożliwia przesłanie formularza na serwer innej firmy.Z dwóch wybrałbym drugi z dwóch powodów. Po pierwsze, jest bardziej niezawodny niż pierwszy, ponieważ Javascript nie jest wymagany do jego działania; dla tych, którzy nie mają włączonej opcji, zawsze możesz wyświetlić przycisk przesyłania ukrytego formularza i poinstruować go, aby go nacisnął, jeśli zajmie to więcej niż 5 sekund. Po drugie, możesz zdecydować, jakie dane zostaną przesłane do serwera innej firmy; jeśli użyjesz tylko formularza w miarę upływu czasu, będziesz przekazywał wszystkie dane postu, co nie zawsze jest tym, czego chcesz. To samo dotyczy rozwiązania 307, zakładając, że działało ono dla wszystkich użytkowników.
Mam nadzieję że to pomoże!
źródło
Możesz użyć tego podejścia:
W wyniku zaraz po klient otrzyma wszystkie HTML z serwera zdarzenie onload nastąpić że wyzwalacze przesyłania formularza i umieszczać wszystkie dane do określonej postbackUrl.
źródło
Do tego służy HttpWebRequest.
Po zakończeniu utwórz HttpWebRequest do swojej strony trzeciej i opublikuj dane formularza, a następnie, gdy to zrobisz, możesz Response.Redirect gdziekolwiek chcesz.
Dodatkową zaletą jest to, że nie trzeba nazywać wszystkich kontrolek serwera, aby utworzyć formularz innej firmy, można wykonać to tłumaczenie podczas budowania łańcucha POST.
Jeśli jednak potrzebujesz, aby użytkownik zobaczył stronę odpowiedzi z tego formularza, jedyną opcją jest skorzystanie z Server.Transfer, a to może, ale nie musi, działać.
źródło
To powinno ułatwić życie. Możesz po prostu użyć metody Response.RedirectWithData (...) w swojej aplikacji internetowej.
źródło
Nowością w programie ASP.Net 3.5 jest właściwość „PostBackUrl” przycisków ASP. Możesz ustawić go na adres strony, na której chcesz publikować bezpośrednio, a po kliknięciu tego przycisku zamiast publikować z powrotem na tej samej stronie, jak zwykle, zamiast tego publikuje na wskazanej stronie. Poręczny. Upewnij się, że wartość UseSubmitBehavior jest również ustawiona na PRAWDA.
źródło
Pomyślałem, że interesujące może być podzielenie się tym, że heroku robi to z SSO dostawcom dodatków
Przykład tego, jak to działa, można zobaczyć w źródle narzędzia „kensa”:
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
I można to zobaczyć w praktyce, jeśli włączysz JavaScript. Przykładowe źródło strony:
źródło
PostbackUrl można ustawić na przycisku asp, aby publikować na innej stronie.
jeśli musisz to zrobić w codebehind, spróbuj Server.Transfer.
źródło
@Matt,
Nadal możesz użyć HttpWebRequest, a następnie przekierować otrzymaną odpowiedź na rzeczywistą odpowiedź strumienia wyjściowego, to odeśle odpowiedź użytkownikowi. Jedynym problemem jest to, że wszelkie względne adresy URL zostałyby zepsute.
Mimo to może to działać.
źródło
Oto co bym zrobił:
Umieść dane w standardowej formie (bez atrybutu runat = "server") i ustaw akcję formularza na publikowanie na docelowej stronie zewnętrznej. Przed przesłaniem przesyłam dane na mój serwer za pomocą XmlHttpRequest i analizuję odpowiedź. Jeśli odpowiedź oznacza, że powinieneś zacząć od POSTingu poza witryną, to ja (JavaScript) kontynuowałbym post, w przeciwnym razie przekierowałbym na stronę w mojej witrynie
źródło
Tak, HttpWebRequest, zobacz mój post poniżej.
źródło
Metoda GET (i HEAD) nigdy nie powinna być używana do robienia czegokolwiek, co ma skutki uboczne. Skutkiem ubocznym może być aktualizacja stanu aplikacji internetowej lub obciążenie karty kredytowej. Jeśli akcja ma skutki uboczne, należy zastosować inną metodę (POST).
Tak więc użytkownik (lub jego przeglądarka) nie powinien być pociągany do odpowiedzialności za coś zrobionego przez GET. Jeśli w wyniku GET wystąpi jakiś szkodliwy lub kosztowny efekt uboczny, będzie to wina aplikacji internetowej, a nie użytkownika. Zgodnie ze specyfikacją agent użytkownika nie może automatycznie podążać za przekierowaniem, chyba że jest to odpowiedź na żądanie GET lub HEAD.
Oczywiście wiele żądań GET ma pewne skutki uboczne, nawet jeśli tylko dołącza się do pliku dziennika. Ważne jest, aby aplikacja, a nie użytkownik, była odpowiedzialna za te efekty.
Odpowiednie sekcje specyfikacji HTTP to 9.1.1 i 9.1.2 oraz 10.3 .
źródło
Sugeruję zbudowanie HttpWebRequest w celu programowego wykonania testu POST, a następnie przekierowanie po przeczytaniu odpowiedzi, jeśli dotyczy.
źródło
Kod do wklejenia w oparciu o metodę Pavlo Neymana
RedirectPost (ciąg adresu URL, T bodyPayload) i GetPostData () są przeznaczone dla tych, którzy chcą po prostu zrzucić niektóre silnie wpisane dane na stronie źródłowej i pobrać je z powrotem w docelowej. Dane muszą być serializowane przez NewtonSoft Json.NET i musisz oczywiście odwoływać się do biblioteki.
Po prostu skopiuj i wklej na swojej stronie (stronach) lub jeszcze lepszej klasie bazowej dla swoich stron i użyj jej w dowolnym miejscu w swojej aplikacji.
Moje serce kieruję do was wszystkich, którzy z jakiegokolwiek powodu nadal musicie korzystać z formularzy internetowych.
źródło
Zazwyczaj wszystko, czego kiedykolwiek potrzebujesz, to przenieść stan między tymi dwoma żądaniami. Jest naprawdę fajny sposób na zrobienie tego, który nie opiera się na JavaScript (pomyśl <noscript />).
Dzięki temu plikowi cookie możesz w następującym żądaniu do /redirect.html pobrać informacje nazwa = wartość, możesz przechowywać dowolny rodzaj informacji w ciągu tej pary nazwa / wartość, na przykład 4K danych (typowy limit plików cookie). Oczywiście należy tego unikać i zamiast tego przechowywać kody stanu i bity flagi.
Po otrzymaniu tego żądania w zamian odpowiedz na żądanie usunięcia tego kodu stanu.
Mój HTTP jest nieco zardzewiały. Przechodziłem przez RFC2109 i RFC2965, aby dowiedzieć się, jak naprawdę jest to wiarygodne, najlepiej chciałbym, aby ciasteczko dokładnie raz podróżowało, ale nie wydaje się to możliwe, również pliki cookie innych firm może być dla Ciebie problemem, jeśli przenosisz się do innej domeny. Jest to nadal możliwe, ale nie tak bezbolesne, jak w przypadku wykonywania czynności we własnej domenie.
Problemem jest współbieżność, jeśli zaawansowany użytkownik korzysta z wielu kart i przeplata kilka żądań należących do tej samej sesji (jest to bardzo mało prawdopodobne, ale nie niemożliwe), może to prowadzić do niespójności w aplikacji.
Jest to <noscript /> sposób robienia podróży w obie strony HTTP bez bezsensownych adresów URL i JavaScript
Podaję ten kod jako prof koncept: jeśli ten kod jest uruchamiany w kontekście, którego nie znasz, myślę, że możesz dowiedzieć się, co to za część.
Chodzi o to, że podczas przekierowania wywołujesz Relocate z pewnym stanem, a adres URL, który relokowałeś, wywołuje GetState w celu uzyskania danych (jeśli takie istnieją).
źródło