Temos o requisito de aceitar o envio de um formulário e salvar alguns dados e, em seguida, redirecionar o usuário para uma página externa, mas no redirecionamento, precisamos "enviar" um formulário com POST, não GET.
Eu esperava que houvesse uma maneira fácil de conseguir isso, mas estou começando a pensar que não há. Acho que agora devo criar uma outra página simples, com apenas o formulário que eu quero, redirecionar para ela, preencher as variáveis do formulário e, em seguida, fazer uma chamada body.onload para um script que apenas chama document.forms [0] .submit ( );
Alguém pode me dizer se existe uma alternativa? Podemos precisar ajustar isso mais tarde no projeto, e isso pode ficar um pouco complicado, por isso, se houvesse uma maneira fácil, poderíamos fazer isso dependendo de outras páginas que não fossem outras, o que seria fantástico.
De qualquer forma, obrigado por todas e quaisquer respostas.
fonte
Respostas:
Para isso, é necessário entender como os redirecionamentos HTTP funcionam. Ao usar
Response.Redirect()
, você envia uma resposta (para o navegador que fez a solicitação) com o Código de Status HTTP 302 , que informa ao navegador para onde ir. Por definição, o navegador fará isso por meio de umaGET
solicitação, mesmo que a solicitação original fosse aPOST
.Outra opção é usar o Código de Status HTTP 307 , que especifica que o navegador deve fazer a solicitação de redirecionamento da mesma maneira que a solicitação original, mas solicitar ao usuário um aviso de segurança. Para fazer isso, você escreveria algo como isto:
Infelizmente, isso nem sempre funciona. Navegadores diferentes implementam isso de maneira diferente , pois não é um código de status comum.
Então, até onde eu sei, a única maneira de implementar algo assim seria usar Javascript. Existem duas opções em que consigo pensar:
action
atributo aponte para o servidor de terceiros. Em seguida, adicione um evento de clique ao botão enviar que primeiro executa uma solicitação AJAX no servidor com os dados e, em seguida, permite que o formulário seja enviado ao servidor de terceiros.Dos dois, eu escolheria o segundo, por duas razões. Primeiro, é mais confiável que o primeiro, porque o Javascript não é necessário para que ele funcione; para aqueles que não o têm ativado, você sempre pode tornar visível o botão de envio do formulário oculto e instruí-lo a pressioná-lo se levar mais de 5 segundos. Segundo, você pode decidir quais dados serão transmitidos ao servidor de terceiros; se você usar apenas o processamento do formulário, ele passará todos os dados da postagem, o que nem sempre é o que você deseja. O mesmo para a solução 307, supondo que funcionasse para todos os seus usuários.
Espero que isto ajude!
fonte
Você pode usar esta abordagem:
Como resultado, logo após o cliente obter todo o html do servidor, ocorre a sobrecarga de eventos que aciona o envio do formulário e publica todos os dados no postbackUrl definido.
fonte
HttpWebRequest é usado para isso.
Na postagem, crie um HttpWebRequest para terceiros e publique os dados do formulário; assim que isso for feito, você poderá Response.Redirect para onde quiser.
Você tem a vantagem adicional de não precisar nomear todos os controles do servidor para formar o formulário de terceiros. Você pode fazer essa tradução ao criar a string POST.
No entanto, se você precisar que o usuário veja a página de resposta neste formulário, sua única opção é utilizar o Server.Transfer e isso pode ou não funcionar.
fonte
Isso deve tornar a vida muito mais fácil. Você pode simplesmente usar o método Response.RedirectWithData (...) em seu aplicativo Web facilmente.
fonte
Algo novo no ASP.Net 3.5 é essa propriedade "PostBackUrl" dos botões ASP. Você pode configurá-lo para o endereço da página na qual deseja postar diretamente e, quando esse botão é clicado, em vez de postar de volta para a mesma página normalmente, ele é postado na página que você indicou. Handy. Certifique-se de que UseSubmitBehavior também esteja definido como TRUE.
fonte
Achei interessante compartilhar que o heroku faz isso com seu SSO para provedores de complementos
Um exemplo de como funciona pode ser visto na fonte da ferramenta "kensa":
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
E pode ser visto na prática se você ativar o javascript. Origem da página de exemplo:
fonte
PostbackUrl pode ser definido no seu botão asp para postar em uma página diferente.
se você precisar fazer isso no code-behind, tente Server.Transfer.
fonte
@Matt,
Você ainda pode usar o HttpWebRequest e, em seguida, direcionar a resposta que você recebe para a resposta real do fluxo de saída, isso serviria a resposta de volta ao usuário. O único problema é que quaisquer URLs relativos seriam quebrados.
Ainda assim, isso pode funcionar.
fonte
Aqui está o que eu faria:
Coloque os dados em um formulário padrão (sem o atributo runat = "server") e defina a ação do formulário para postar na página externa de destino. Antes de enviar, eu enviava os dados ao meu servidor usando um XmlHttpRequest e analisava a resposta. Se a resposta significa que você deve prosseguir com o POST externo, então eu (o JavaScript) continuaria com a postagem, caso contrário eu redirecionaria para uma página do meu site
fonte
Sim, HttpWebRequest, veja meu post abaixo.
fonte
O método GET (e HEAD) nunca deve ser usado para fazer algo que tenha efeitos colaterais. Um efeito colateral pode estar atualizando o estado de um aplicativo Web ou pode estar cobrando no seu cartão de crédito. Se uma ação tiver efeitos colaterais, outro método (POST) deve ser usado.
Portanto, um usuário (ou seu navegador) não deve ser responsabilizado por algo feito por um GET. Se algum efeito colateral prejudicial ou caro ocorrer como resultado de um GET, isso seria culpa do aplicativo da Web, não do usuário. De acordo com as especificações, um agente de usuário não deve seguir automaticamente um redirecionamento, a menos que seja uma resposta a uma solicitação GET ou HEAD.
Obviamente, muitas solicitações GET têm alguns efeitos colaterais, mesmo que sejam apenas anexadas a um arquivo de log. O importante é que o aplicativo, não o usuário, seja responsabilizado por esses efeitos.
As seções relevantes da especificação HTTP são 9.1.1 e 9.1.2 e 10.3 .
fonte
Sugiro a criação de um HttpWebRequest para executar programaticamente seu POST e, em seguida, redirecionar depois de ler a resposta, se aplicável.
fonte
Código passível de cópia com base no método de Pavlo Neyman
RedirectPost (string url, T bodyPayload) e GetPostData () são para aqueles que desejam apenas despejar alguns dados fortemente digitados na página de origem e recuperá-los no destino. Os dados devem ser serializáveis pelo NewtonSoft Json.NET e você precisa fazer referência à biblioteca, é claro.
Apenas copie e cole nas suas páginas ou, melhor ainda, na classe base das suas páginas e use-a em qualquer lugar do seu aplicativo.
Meu coração está com todos vocês que ainda precisam usar Web Forms em 2019 por qualquer motivo.
fonte
Normalmente, tudo que você precisa é transportar algum estado entre essas duas solicitações. Na verdade, há uma maneira realmente divertida de fazer isso, que não depende de JavaScript (pense <noscript />).
Com esse cookie, é possível, na solicitação a seguir /redirect.html recuperar as informações name = value, você pode armazenar qualquer tipo de informação nessa cadeia de pares nome / valor, até 4K de dados (limite de cookie típico). Claro que você deve evitar isso e armazenar códigos de status e bits de sinalizador.
Ao receber esta solicitação, você responderá com uma solicitação de exclusão para esse código de status.
Meu HTTP está um pouco enferrujado. Estou analisando o RFC2109 e o RFC2965 para descobrir o quão confiável isso é, de preferência eu gostaria que o cookie retornasse exatamente uma vez, mas isso não parece ser possível, também, cookies de terceiros pode ser um problema para você se estiver se mudando para outro domínio. Isso ainda é possível, mas não tão indolor quanto quando você está fazendo coisas em seu próprio domínio.
O problema aqui é a simultaneidade, se um usuário avançado estiver usando várias guias e conseguir intercalar algumas solicitações pertencentes à mesma sessão (isso é muito improvável, mas não impossível), isso poderá levar a inconsistências no seu aplicativo.
É a maneira <noscript /> de fazer viagens de ida e volta por HTTP sem URLs sem sentido e JavaScript
Eu forneço esse código como um conceito profundo: se esse código é executado em um contexto que você não conhece, acho que pode descobrir qual parte é o quê.
A idéia é que você chame Relocate com algum estado ao redirecionar, e o URL que você relocou chama GetState para obter os dados (se houver).
fonte