Pergunta

ASP.NET controles do lado do servidor postback para sua própria página.Isso faz com casos onde você deseja redirecionar um usuário para uma página externa, mas precisa colocar nessa página por algum motivo (para autenticação, por exemplo) de uma dor.

Um HttpWebRequest funciona muito bem se você não deseja redirecionar e JavaScript é bom, em alguns casos, mas pode ficar complicado se você realmente precisa de código do lado do servidor para obter o conjunto de dados para o cargo.

Então, como você tanto post para uma URL externa e redirecionar o usuário para o resultado do seu ASP.NET code-behind código?

Foi útil?

Solução

Aqui está o que eu resolver esse problema hoje.Eu comecei a partir de este artigo no C# do Canto, mas não encontrei o exemplo - embora tecnicamente som - um pouco incompleta.Tudo o que ele disse estava certo, mas eu precisava para bater em alguns sites externos a peça esta em conjunto para o trabalho exatamente como eu queria.

Não ajuda que o usuário não foi tecnicamente o envio de um formulário em tudo;eles foram clicar em um link para ir para o nosso centro de suporte, mas fazê-los em um http post tinha que ser feito para o centro de suporte do site.

Esta solução envolve o uso de HttpContext.Atual.Resposta.Write() para gravar os dados para o formulário e, em seguida, usando um pouco de Javascript no

<body onload=""> 

método de enviar o formulário para o URL correcto.

Quando o usuário clica sobre o Centro de Suporte de ligação, o método a seguir é chamado para escrever a resposta e redirecionar o usuário:

public static void PassthroughAuthentication()
{

    System.Web.HttpContext.Current.Response.Write("<body 
    onload=document.forms[0].submit();window.location=\"Home.aspx\";>");

    System.Web.HttpContext.Current.Response.Write("<form name=\"Form\" 
    target=_blank method=post 
    action=\"https://external-url.com/security.asp\">");

    System.Web.HttpContext.Current.Response.Write(string.Format("<input 
       type=hidden name=\"cFName\" value=\"{0}\">", "Username"));

    System.Web.HttpContext.Current.Response.Write("</form>");
    System.Web.HttpContext.Current.Response.Write("</body>");
}

A chave para este método é que onload pouco de Javascript, que , quando o corpo da página carrega, submete o formulário e, em seguida, redireciona o usuário de volta para a minha própria Home page.A razão para que o bit de hoodoo é que eu estou lançando o site externo em uma nova janela, mas não deseja que o usuário reenviar o formulário oculto se eles atualizar a página.Mais que de formulário ocultos empurrou a página para baixo alguns pixels que tenho em meus nervos.

Eu estaria muito interessado em qualquer aspirador de idéias alguém tem sobre um presente.

Eric Sipple

Outras dicas

Eu comecei com este exemplo de CodeProject

Em seguida, em vez de adicionar a página, eu emprestado do saalon (acima) e fez uma Resposta.Write().

Eu ia fazer o post de formulário em seu código por trás do uso da classe HttpWebRequest.Aqui é um bom auxiliar de classe para ter seu início:

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

A partir daí, você pode fazer apenas uma Resposta.Redirecionar, ou, talvez, você precisa variar a sua ação com base no resultado do post (se é que houve um erro, mostrar para o usuário ou qualquer outra coisa).Eu acho que você já tinha a resposta na sua pergunta, para ser honesto - parece que você acha que isso é um post OU redirecionar, quando na realidade você pode fazer ambos do código subjacente.

Eu tenho feito isso por processamento de um formulário de auto-posts (JavaScript), para o desejado URL remoto - coletar qualquer informação que você precisa para o post do formulário web de reposição e, em seguida, criar o HTML para o controle remoto de postagem de formulário e torná-lo de volta para o cliente.

Eu construí uma classe de utilitário para este que contém o URL remoto e uma coleção de pares nome/valor para o formulário.

Cross-page posting irá funcionar se você for proprietário de páginas envolvidos, mas não se você precisa de postar em outro site (o PayPal, por exemplo).

Se você estiver usando ASP.NET 2.0, você pode fazer isso com cross-page posting.

Editar:Eu perdi o fato de que você está perguntando sobre uma externo página.Por que eu acho que você precisaria para ter o seu ASP.NET página gen de um formulário HTML, cuja ação está definida para a URL remoto e o método é definido para POSTAR.(Usando cross-page posting, isso pode até ser uma página diferente com nenhuma INTERFACE do usuário, apenas oculta os elementos de formulário.) Em seguida, adicione um pouco de javascript para submeter o formulário assim que o postback resultado foi recebida no cliente.

Eu precisava para abrir na mesma janela, lidar com possível quadro de problemas a partir da página original, redirecionando para um site externo em code-behind:

Private Sub ExternalRedirector(ByVal externalUrl As String)
    Dim clientRedirectName As String = "ClientExternalRedirect"
    Dim externalRedirectJS As New StringBuilder()

    If Not String.IsNullOrEmpty(externalUrl) Then
        If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then
            externalRedirectJS.Append("function CheckWindow() {")
            externalRedirectJS.Append("   if (window.top != window) {")
            externalRedirectJS.Append("       window.top.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("       return false;")
            externalRedirectJS.Append("   }")
            externalRedirectJS.Append("   else {")
            externalRedirectJS.Append("   window.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("   }")
            externalRedirectJS.Append("}")
            externalRedirectJS.Append("CheckWindow();")

            Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True)
        End If
    End If
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top