segunda-feira, setembro 21, 2009

Site não indexado pelo Google

Desde que publicamos o novo site da empresa o Google parou de indexá-lo misteriosamente. Verificamos toda a documentação disponível, utilizamos as ferramentas disponibilizadas para análise e a única coisa que detectamos foi que o Googlebot indicava rede inacessível para todos os links.

Hoje tivemos acesso a uma ferramenta de validação chamada Dr. Watson e, graças a ela, verificamos uma falha no código. Ao entrar no site, verificamos imediatamente as linguagens aceitas pelo visitante e apresentamos a ele se tiver disponível (Português, Inglês, Espanhol ou Francês). Porém, a variável que checamos só é válida quando a requisição parte de um navegador, nunca de uma ferramenta automatizada como é o caso do Dr. Watson ou do Googlebot.

Um simples if teria evitado tanto transtorno. Abaixo segue a solução implementada:

if (Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"] != null)
{
strAcceptLanguage = Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"].ToString().Split(',');
}

terça-feira, março 24, 2009

Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)

Este erro costuma aparecer quando tentamos adicionar controles dinamicamente ao ciclo de vida de uma página.

Se a página contém um lock do tipo <%= %> dentro de seu conteúdo, apenas na tag <head></head> não é possível adicionar o controle.

Corrige-se este erro removendo a parte do script que possui esse lock do cabeçalho da página.

EN: If you need this article in English, leave a messege. FR: Si vous avez besoin de ce texte en Français laissez une message à moi. ES: Si usted necesita este artículo en Español, dejame un mensaje.

Capturando chaves compostas em uma GridView

O controle GridView permite a definição de chaves ID múltiplas - DataKeys - através da propriedade DataKeyNames (array de strings).

O acesso à essas chaves é obscuro e pouco documentado, já que normalmente a subpropriedade Count da propriedade GridView.DataKeys sempre retorna o valor 1 independentemente da quantidade de chaves que se tenha definido inicialmente.

A melhor forma de encontrar esses dados é seguindo o padrão abaixo:

VB.NET

GridView.DataKeys(Index1).Values(Index2)

C#
GridView.DataKeys[Index1].Values[Index2]

Ao alterar o valor do índice Index2, encontra-se o DataKey desejado.

EN: If you need this article in English, leave a messege. FR: Si vous avez besoin de ce texte en Français laissez une message à moi. ES: Si usted necesita este artículo en Español, dejame un mensaje.

sexta-feira, março 20, 2009

Scripts não funcionam com RegisterStartupScript e RegisterClientScriptBlock

Um simples bloco de comandos em JavaScript não funciona com RegisterStartupScript e RegisterClientScriptBlock após um PostBack.

Para registrarmos um bloco de comandos, utilizamos normalmente o seguinte comando:

Page.ClientScript.RegisterStartupScript(page.GetType(), Guid.NewGuid().ToString(), “alert(‘hello’)”, true);

Em páginas normais, este comando funciona perfeitamente. No entanto, se o controle responsável pelo PostBack estiver dentro de um UpdatePanel, o comando simplesmente deixará de funcionar.

Como o rendering do Ajax é diferente do utilizado pela página, devemos utilizar uma classe estática para registrar o comando:

ScriptManager.RegisterStartupScript(page, page.GetType(), Guid.NewGuid().ToString(), “alert(‘hello’)”, true);

Boa sorte!

EN: If you need this article in English, leave a messege. FR: Si vous avez besoin de ce texte en Français laissez une message à moi. ES: Si usted necesita este artículo en Español, dejame un mensaje.

terça-feira, março 17, 2009

Aplicativos em ambientes compartilhados: assinatura de projetos

Se você optou por desenvolver seu aplicativo no modelo Web Application Project e precisa implantá-lo em um servidor compartilhado com trust level configurado para medium, assiná-lo é um pré-requisito. A mesma regra é válida para os componentes de terceiros que você estiver utilizando.

Procedimento
  • Clique no projeto (botão direito) e selecione a opção Properties;

  • Verifique que o VS abrirá uma página com abas organizadas na vertical. Selecione a penúltima opção Signing;

  • Clique na caixa de seleção Sign the assembly. Os demais campos serão habilitados;

  • Na caixa de combinação, selecione a opção para visualizar o formulário abaixo:


  • No campo key file name, informe o nome desejado para o arquivo de assinatura com a extensão .pfx. Ex. ProjetoAlfa.pfx;
  • Opcionalmente você pode informar uma senha para proteger o arquivo.

Repita os passos acima para todos os projetos de sua solução.

Importante: Sempre que compilar algum dos projetos, você deverá compilar os demais e publicá-los juntos.

Testes de validação

Para testar os procedimentos de assinatura e verificar se seu projeto está em conformidade com o nível de segurança exigido pelo ambiente compartilhado, inclua a tag trust logo após a tag system.web:

<system.web>
<trust level="Medium" />(...)

EN: If you need this article in English, leave a messege. FR: Si vous avez besoin de ce texte en Français laissez une message à moi. ES: Si usted necesita este artículo en Español, dejame un mensaje.