Erro ao modificar o Xsl de um resultado de busca

27 01 2010

Olá pessoal!

A dica de agora veio de um problema que eu encontrei ao modificar o Xsl de um resultado de busca. Após fazer uma mudança insignificante no Xsl veio o seguinte erro:

System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at Microsoft.Office.Server.Search.WebControls.PeopleCoreResultsWebPart.SetSortedRefinementDataOnHiddenObject() at Microsoft.Office.Server.Search.WebControls.PeopleCoreResultsWebPart.GetXPathNavigator(String viewPath)

Voltei o Xsl ao estado original e o erro persistiu. Na verdade eu não tenho exatamente a solução pra ele, mas quando publiquei novamente a página o erro sumiu e os dados foram exibidos corretamente.

De qualquer forma eu recomendo gravar uma versão da página inteira antes de alterar esse item. Mas, se esse problema acontecer com você e antes de arrancar os cabelos, publique a página!

Espero que essa dica ajude como me ajudou!

Abs.,

Danilo





Administrador da Farm não consegue abrir o site dentro do próprio servidor

21 01 2010

Falae galera! Já faz algum tempo que não escreve, mas resolvi passar aqui e deixar essa dica.

Cenário: Estava acessando um site Sharepoint de dentro da minha VM de desenvolvimento. Essa VM roda com um Windows 2003 Enterprise e MOSS 2007. Quando acessei o site (que estava configurado para login no AD – padrão) ele me pediu usuário e senha. Isso seria normal se eu já não estivesse logado na máquina como administrador, que também é o administrador da Farm desse site Sharepoint. Mesmo criando outro usuário e dando os mesmo poderes ainda assim não consegui entrar no site.

Solução: Falando com o meu amigo Hélio Sá, ele me passou o seguinte. O problema ocorre quando o site usa a autenticação integrada e tem um nome mapeado para o endereço de loopback local. Basta alterar uma chave no registro, reiniciar a máquina e voilá! o site volta a funcionar. A chave é a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck. Caso ela não exista é só criar e atribuir o valor 1.

O passo a passo está neste kb http://support.microsoft.com/kb/896861/.

See ya!





Project Natal

4 06 2009

Eae pessoal? Passei para dar uma postada rápida sobre o project Natal do Xbox. Achei o video de demo fantástico! Se for 50% disso, o negócio vai ser revolucionário.

Segue o vídeo abaixo:





Recursos de teste de performance pra Sharepoint

15 05 2009

Pessoal, segue abaixo link para várias ferramentas, artigos, white papers e outros recursos para medir e testar a performance da implementação do Sharepoinit. Por Sanjay Narang: http://blogs.msdn.com/sanjaynarang/archive/2009/04/18/sharepoint-performance-stress-load-testing.aspx





Access Denied on Search

8 04 2009

Sessão troubleshooting. Fiz uma instalação e configuração de MOSS com Search. Tudo funcionando bonitinho. Ou quase. Fui checar o crawl da busca e vi que ele não indexou nenhum item. além disso no log estava constando vários erros de access denied (Access is denied. Check that the Default Content Access Account has access to this content, or add a crawl rule to crawl this content, para ser mais exato).

Pois bem. Comecei a procurar e fui olhar nos lugares óbvios. Conta de acesso do serviço de indexação. Conta padrão de acesso ao conteúdo. Como estava na VM de desenvolvimento, coloquei o administrador, para que não houvesse dúvidas. O problema persistiu.

Foi quando eu descobri um KB relatando esse problema. Isso acontece em ambientes Windows 2003 com SP1, e quando se usa diversos host headers para webapplications diferentes.

O fix para esse problema é a inclusão de uma chave no registro. A chave é HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa. Dentro adicionar uma DWORD com o nome DisableLoopbackCheck. Depois setar o valor para 1.

Reinicie a maquina e voilá! Agora o indexador funciona perfeitamente!

Para mais detalhes do fix: http://support.microsoft.com/default.aspx/kb/896861

;) Danilo





Sharepoint Designer Free!

6 04 2009

O Dênis me mandou essa mensagem há algum tempo, mas eu não acreditei, porque lá dizia que a data em que iria começar era 1o. de abril. Bom, mas eu vi agora e é verdade. Vou divulgado no blog do time de produto do Sharepoint que o Sharepoint Designer passar a ser grátis.

Isso vem para somar e ajudar com os deploys, especialmente de pacotes menores.

Quem quizer saber mais sobre o assunto, veja o post do time de produto.

;) Danilo





Customizando Retorno de Busca com FullTextSqlQuery

3 04 2009

Hoje eu vou falar sobre objeto FullTextSqlQuery e como customizar o resultado de busca com ele. Ele está localizado no namespace Microsoft.Office.Server.Search.Query e herda da classe Query.

Esta classe permite que você use uma sintaxe de SQL (com limitações) para customizar as buscas do Sharepoint. Segue abaixo um exemplo:

using (SPSite siteCollection = SPContext.Current.Site){
	FullTextSqlQuery query = new FullTextSqlQuery(siteCollection);
	query.QueryText = string.Format("SELECT Title FROM SCOPE() WHERE FREETEXT(defaultproperties, '{0}*') AND \"Scope\"='People' ", prefixText);
	query.ResultTypes = ResultType.RelevantResults;
	query.RowLimit = 10;

	ResultTableCollection queryResults = query.Execute();
	ResultTable queryResultsTable = queryResults[ResultType.RelevantResults];

	while(queryResultsTable.Read())
		context.Response.Write(queryResultsTable.GetString(0) +  Environment.NewLine);
}

No exemplo acima eu estou criando um objeto FullTextSqlQuery e monto uma query. Defino o tipo de resultados e quantidade limite de retorno. Depois de executar ele me retorna um objeto ResultTableCollection. Dessa coleção pegamos um ResultaTable e o lemos como um DataReader.

Alguns pontos. O FROM da clausula SQL é o SCOPE() sempre. O comando FREETEXTestá buscando em todas as propriedades padrão de busca (semelhante a uma busca por palavra-chave. Depois temos a segunda condição que diz “Scope” = ‘People’. Neste item definimos o escopo de busca. Se for criado um escopo customizado no SSP é nesse momento que você deve referenciá-lo. No exemplo acima, a query está fazendo uma busca em pessoas.

Com esta query podemos filtrar e retornar qualquer propriedade mapeada. No meu caso isso foi importante pois eu precisei fazer a implementação de uma tela de busca avançada customizada.

Bom este é o básico necessário para a implementação deste objeto. Em outros posts irei aprofundar mais o assunto.

;) Danilo





WSP Builder

2 04 2009

Olá. No último projeto que trabalhei, fiz a utilização de uma ferramenta chamada WSP Builder. Vou escrever aqui as minhas impressões.

De modo geral a ferramenta é muito boa. Eu não sou fã de desenvolvimento direto no servidor, nem de instalar o Windows 2003 e usar ele como client. Para o meu modo de desenvolvimento, a ferramenta me atendeu em quase tudo.

Basicamente o WSP Builder gera uma solution, seguindo a estrutura de pastas parecida com a estrutura do Sharepoint. Por elas ele se guia e monta automaticamente o manifest. Isso poupa muito tempo e possíveis erros. A única coisa que tive que fazer manualmente é a manipulação dos xmls de feature. Cada recurso ele dá opção de gerar uma nova feature. Contudo se quiser colocar todos os arquivos numa única feature, é necessário alterar manualmente o arquivo xml correspondente. Não é complicado mas exige conhecimento na estrutura.

O mais legal que eu achei nele é dar a opção da pessoa trabalhar como quiser. Eu, como falei antes, prefiro desenvolver os pacotes e mandar para um servidor. Tem pessoas que preferem desenvolver diretamente no servidor. Ele tem a opção tanto de deploy quanto de geração do pacote wsp.

Bom essas foram as primeiras impressões com o projeto piloto. Vou continuar postando aqui conforme for utilizando mais.

Para quem quiser conhecer acesse o link para baixar a ferramenta

:) Danilo





Criar Site Collection em um novo Database

23 03 2009

Nos últimos dias surgiu uma demanda para um site existente, onde o cliente queria um repositório de documentos com busca e tudo o mais. Eu fiquei preocupado sobre o impacto do volume de conteúdo extra poderia gerar ao portal principal. Neste momento decidi que deveria criar o Site Collection em um novo banco de dados de conteúdo. O problema é que essa não é uma tarefa tão trivial quanto parece.

Ao criar um novo Site Collection, o Sharepoint não dá opçao de selecionar o banco de dados a ser utilizado. Se houver mais de um, ele escolhe um e cria nele baseado em uma análise inteligente de uso. Contudo eu queria que fosse o banco isoladamente para este Site Collection e também queria que mais nenhum site fosse criado nele.

Existem duas formas de atingir este objetivo. O primeiro é deixar todos os banco que você NÃO quer utilizar em modo offline, só restando o banco em que você quer criar o site. Uma informação importante é que deixando o banco de dados offline, não quer dizer que ele esteja realmente desligado. Ele simplesmente não permite que se crie novos Site Collections nele. Essa informação foi útil para a segunda parte do meu problema, pois eu não queria nenhum outro Site Collection criado neste banco depois.

Outra forma é pelo stsadm. Nesta forma, o banco de dados não pode estar criado ainda. O comando é o seguinte:

stsadm –o createsiteinnewdb –url [Url do site] –owneremail [e-mail] –ownerlogin [login do usuário] –sitetemplate [modelo de criação do site] –title [título do site] –databaseserver [servidor do banco de dados] –databasename [nome do banco de dados]

Espero que ajude! :)





Sharepoint Log

6 03 2009

Me deparei com um código e achei bacana postar aqui. Ele serve para criar uma entrada no arquivo de log do Sharepoint.

Eu sei que o log do Sharepoint não é muito fácil de ser lido (não sem alguma ferramente auxiliar), mas de qualquer é o lugar oficial onde as pessoas vão (ou pelo menos deveriam) procurar quando algum erro estranho acontece.

Bom, segue o código abaixo:


Microsoft.Office.Server.Diagnostics.PortalLog.LogString(”Exception Occurred:
{0} || {1}”, myException.Message, myException.StackTrace)

Espero que ajude

:) Danilo