Olá. Vou fugir um pouco do foco do blog que é C# e assuntos mais elementares de programação para compartilhar uma solução para um problema que tive recentemente na empresa que trabalho.
Cenário
Durante o desenvolvimento de uma aplicação com .Net Framework que usava colunas do tipo FILESTREAM do SQL Server 2008 R2, ao ler a documentação descobri que para poder fazer upload e download de conteúdo para o banco de dados – que armazena arquivos e indexa o seu conteúdo – deveria usar Windows Authentication ou não iria poder executar a tarefa.
A primeira escolha foi cadastrar um usuário do domínio como usuário do SQL Server para a Windows Authentication. Ao executar o programa na máquina de desenvolvimento, tudo foi tranquilo. Tanto o upload como o download foram rápidos e aceitáveis, mas, quando fizemos o teste em estações da rede e até mesmo usando máquinas virtuais, o resultado foi decepcionante.
Primeiramente, foi necessário usar um recurso do Windows chamado “impersonate” no qual se armazena as credenciais de um usuário e, quando for necessário, carrega-se estesas para poder conectar-se ao banco. Ao executar as operações com os arquivos chegamos a ter quase um minuto de espera pela primeira conexão.
Nem preciso dizer que isto foi inaceitável. Dentre as várias soluções, tentamos colocar o IP na string de conexão em vez do nome do servidor, verificamos configurações de rede, instalação do SQL Server e nada disto trouxe resultados.
A Solução
Para solucionar o problema, resolvi cadastrar um usuário local no servidor que não estivesse vinculado com o domínio e armazenar as suas credenciais para poder executar o impersonate.
Assim, com o usuário local (cadastrado no servidor e no SQL Server como usuário do banco), o problema resolvido e a conexão voltou a ficar rápida tanto executando localmente como nas estações de rede.
Apenas tome cuidado se no seu caso é viável fazer este tipo de cadastro de usuário. Podem haver cenários onde você precise obrigatóriamente usar as credenciais do domínio, neste caso, bem vindo à lentidão. Não encontrei (ainda) solução.
Que saber mais sobre FILESTREAM e IMPERSONATE? Veja os links:
FILESTREAM Overview: http://technet.microsoft.com/en-us/library/bb933993.aspx
WindowsIdentity.Impersonate Method: http://msdn.microsoft.com/en-us/library/w070t6ka.aspx