Pergunta

Estamos escrevendo um aplicativo de pesquisa que salva os critérios de pesquisa para o estado da sessão e executa o interior busca de um updatepanel asp.net. Às vezes, quando nós executamos várias pesquisas sucessivamente a busca 2º ou 3º, às vezes, retornar resultados do primeiro conjunto de critérios de pesquisa.

Exemplo: a nossa primeira pesquisa que fazemos um olhar-se em "John Smith" -> resultados John Smith são exibidos. A segunda pesquisa que fazemos um olhar-se em "Bob Jones" -> resultados John Smith são exibidos.

Nós salvar todos os critérios de pesquisa no estado da sessão como eu disse, e lê-lo a partir do interior de estado de sessão da solicitação ajax para formatar a consulta DB. Quando colocamos break points em tudo se comporta VS como normal, mas sem eles temos os critérios de pesquisa originais e resultados.

Meu palpite é porque eles são salvos na sessão, que o pedido ajax alguma forma obtém sua própria sessão e salva os critérios para que, em seguida, recupera os critérios dessa sessão de cada vez, mas o material não-async é capaz de ver quando os critérios é modificada e salva as alterações para o estado de conformidade, mas porque eles são de duas sessões diferentes, há uma disparidade no que é salvo e ler.

EDIT ::: Para elaborar mais, houve uma sugestão de anexar os critérios de pesquisa para a string de consulta que normalmente é uma boa prática e eu concordo é como ele deve ser, mas seguindo as nossas exigências não vejo isso como sendo viável. Eles querem que assim que os preenchimentos usuário para fora os hits controles de entrada de pesquisa e não há recarregar a página, a única coisa que eles vêem é um indicador de progresso na página, e eles ainda têm a capacidade de navegar e usar outros recursos na página atual. Se eu fosse para adicionar critérios para a string de consulta que eu teria que fazer outro pedido fazendo com que a página inteira a carga, o que, dependendo dos critérios de pesquisa pode levar um tempo muito longo. É por isso que nós estamos usando uma chamada ajax para realizar a pesquisa e por que não estão causando outra solicitação de página inteira ..... Espero que isso esclarece a situação.

Foi útil?

Solução

Não há várias sessões entre cargas normais de páginas ASP.NET, postagens e postbacks parciais ASP.NET AJAX. Posso dizer-lhe que, com certeza.

Em vez de armazenar a seqüência de pesquisa na sessão, como sobre apenas usando a busca conteúdo caixa de texto diretamente? Eu não posso pensar em qualquer razão para que você precisaria para baralhar ao redor, uma vez que estará disponível ao longo de todo o ciclo de vida página de qualquer maneira.

Finalmente, sobre suas necessidades ... Usando um UpdatePanel faz não cumprir a exigência de que os usuários devem ser capazes de utilizar outras funcionalidades na página se que a funcionalidade também levanta postbacks parciais. Apenas um postback parcial pode estar em andamento ao mesmo tempo. Se um outro evento é gerado durante a sua pesquisa está em andamento, a solicitação de pesquisa será cancelada sem qualquer notificação.

Usando um método de página ou serviço web para a busca seria um muito mais rápido mais fácil, e mais robusto maneira de fazê-lo,. Eu não costumo ligar o meu próprio site, mas acho que um par de meus posts são exatamente relevantes para o que você está fazendo:

Você pode usar um controle de usuário para tornar os resultados da pesquisa através de um serviço web (muito mais rápido do que um UpdatePanel): http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

Ou, você poderia retornar os resultados da pesquisa como JSON e torná que no lado do cliente (ainda mais rápido): http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to- build-a-client-side-repetidor /

De qualquer desses métodos poderiam levar a sua funcionalidade de pesquisa fora do paradigma postback parcial, de modo que ele corre mais rápido, usa menos largura de banda e de recursos do servidor, e não exclui outra atividade UpdatePanel ocorra simultaneamente.

Outras dicas

Apenas um outro pensamento, eu sempre tiver problemas com updatepanel e preferem escrever minhas atlas requisições Ajax através da biblioteca diretamente, usando PageMethods. Você tem mais controle sobre o que você enviar e receber. UpdatePanel envia a página inteira, e recebe toda a hierarquia de controle da página, em seguida, ele analisa o que é 'fresco' e mostra isso.

Edit: O que é o código que você está usando para salvar os critérios para a sessão? E você tem código no método que realmente verifica se a sessão tem alguns critérios guardados, e passa isso de volta em vez disso? Talvez por isso o 2º / 3º postbacks UpdatePanel estão retornando o primeiro conjunto de critérios em vez dos resultados esperados? Como um aparte, eu sei de fazer alguns pesados ??atlas ajax coisas que há definitivamente não duas sessões (uma para postback normais, uma para assíncrono) Existe alguma chance de você estiver usando uma webfarm?

Edit # 2: Eu não teria sido capaz de escrever o que eu escrevi acima (primeiro parágrafo) se eu não tivesse sido um fã de alguém que respondeu assim: https://stackoverflow.com/users/60/dave-ward

Você precisa definir a propriedade EnableSession do atributo WebMethod para a função que você está chamando.

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}

Se você usa manipuladores de genéricos .ashx, apenas derivar de interface de IRequiresSessionState

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top