SQL Generic Error – Busca Nativa CRM

February 4, 2016 Leave a comment

Cenário:

Ao realizar buscas no CRM, algumas telas trazem resultados, outras dão o erro SQL Generic Error (ao baixar o Arquivo de Log).

clip_image002

ERRO:

Generic SQL Error.

Mas ao investigar nos logs de Trace do CRM e EventViewer podemos notar referências ao SQL Generic Error com o erro abaixo:

“SQL Server encountered error 0x80070422 while communicating with full-text filter daemon host (FDHost) process. Make sure that the FDHost process is running. To re-start the FDHost process, run the sp_fulltext_service ‘restart_all_fdhosts’ command or restart the SQL Server instance.”

SOLUÇÃO:

Com isso observamos que o serviço “SQL Full-text Filter Daemon Launcher” estava parado, pois por padrão, o serviço vem configurado para ser “Manual”. Ou seja, se o serviço cair por algum motivo, ele não será iniciado automaticamente.

image

Para resolver o problema bastou iniciar o serviço “SQL Full-text Filter Daemon Launcher” e aguardar alguns minutos.

clip_image004

Se não resolver apenas iniciando o serviço, devemos executar um comando no SQL e talvez mandar reconstruir o catálogo.

EXEC sp_fulltext_service 'restart_all_fdhosts'

DatabaseName > Storage > Full Text Catalog > properties > Rebuild Catalog.

Abraço!

Advertisements

Value cannot be null – Instanciando OrganizationServiceProxy

December 30, 2015 Leave a comment

Cenário:

Meu primeiro post sobre Microsoft CRM! Smiley de boca aberta

Nas últimas semanas venho trabalhando em análise e melhoria de performance de alguns serviços que fazem integração entre uma aplicação legada e o Microsoft CRM 2015, usando IFD.

Os serviços estão deveras lentos. Nesse processo de análise estamos montando aplicações de testes paralelas aos serviços… e nessas aplicações estamos simulando maneiras diferentes de instanciar o serviço de comunicação com o CRM.

Para isso estou utilizando o SDK do CRM como base de apoio aos testes: http://go.microsoft.com/fwlink/?LinkID=512122.

ERRO:

Value cannot be null.

SOLUÇÃO:

Na correria… acabei copiando e colando uma url que deveria ser diferente!

No SDK do CRM, há um tipo de autenticação se usar os “Helpers” que existem no SDK. Nesse exemplo ele pede para instanciar assim:

 

#region Class Level Members

// To get discovery service address and organization unique name,

// Sign in to your CRM org and click Settings, Customization, Developer Resources.

// On Developer Resource page, find the discovery service address under Service Endpoints and organization unique name under Your Organization Information.

private String _discoveryServiceAddress = "https://MyCompany/XRMServices/2011/Discovery.svc";

private String _organizationUniqueName = "OrganizationUniqueName";

// Provide your user name and password.

private String _userName = "username@mydomain.com";

private String _password = "password";

// Provide domain name for the On-Premises org.

private String _domain = "mydomain";

#endregion Class Level Members

 

E aí ao trocar a url, eu copiei e colei uma url errada… coloquei a url “Organization.svc” ao invés da url correta “Discovery.svc”.

Ao colocar a url errada e tentar instanciar o OrganizationServiceProxy, dá o erro mencionado acima nesse método abaixo:

 

/// <summary>

/// Discovers the organizations that the calling user belongs to.

/// </summary>

/// <param name="service">A Discovery service proxy instance.</param>

/// <returns>Array containing detailed information on each organization that

/// the user belongs to.</returns>

public OrganizationDetailCollection DiscoverOrganizations(

IDiscoveryService service)

{

if (service == null) throw new ArgumentNullException("service");

RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();

RetrieveOrganizationsResponse orgResponse =

(RetrieveOrganizationsResponse)service.Execute(orgRequest);

return orgResponse.Details;

}

 

Após colocar a URL correta “Discovery.svc” , tudo funcionou perfeitamente.

Abraço!

The security validation for this page is invalid and might be corrupted. Please use your web browser’s Back button to try your operation again

October 19, 2015 3 comments

Cenário:

Estou simulando um “stress test” no meu ambiente de desenvolvimento para simular o impacto (hardware) de algumas operações do SharePoint 2013.

No meu teste, além de navegar e buscar alguns itens no site, também quero que o “robô” crie itens nas listas do SharePoint através de requests HTTP.

Ao tentar criar itens usando uma chamada HTTP com as APIs do SharePoint temos o erro mencionado a seguir.

ERRO:

The security validation for this page is invalid and might be corrupted. Please use your web browser’s Back button to try your operation again

Ou, PT-BR:

A validação de segurança para esta página não é valida e pode estar corrompida. Use o botão Voltar do navegador Web para tentar realizar a operação novamente.

SOLUÇÃO:

Como não estou usando OAuth para autorizar a requisição, precisamos passar um “digest value” válido no Header da requisição.

Conseguimos pegar esse valor em um campo (__REQUESTDIGEST) escondido da MasterPage padrão do SharePoint:

 

<input type="hidden" name="__REQUESTDIGEST" id="__REQUESTDIGEST" value="0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8590
ADE4C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000
" />

 

Ou fazendo uma chamada POST com o “body” vazio para http://<site url>/_api/contextinfo antes da chamada que irá criar o item. O retorno dessa chamada conseguimos pegar o “digest value”.

No “Header” dessa chamada com “body” vazio, passe o parâmetro “Accept” com valor “application/json;odata=verbose”.

Exemplo da chamada ao contextinfo:

image

Resposta do contextinfo:

image

{"d":{"GetContextWebInformation":{"__metadata":{"type":"SP.ContextWebInformation"},"FormDigestTimeoutSeconds":1800,"FormDigestValue":
"0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8
590ADE4C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000
"
,"LibraryVersion":"15.0.4569.1000","SiteFullUrl":http://vmsp2013,
"SupportedSchemaVersions":{"__metadata":{"type":"Collection(Edm.String)"},"results":["14.0.0.0","15.0.0.0"]},"WebFullUrl":"http://vmsp2013&quot;}}}

O valor em realce é o valor do parâmetro “X-RequestDigest” que precisamos passar no “Header” da requisição que irá criar itens na lista do SharePoint.

Exemplo da requisição que cria itens em uma lista do SharePont 2013:

POST http://vmsp2013/_vti_bin/client.svc/ProcessQuery

POST data:

<Request xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009&quot; SchemaVersion="15.0.0.0" LibraryVersion="15.0.0.0" ApplicationName="Javascript Library"><Actions>TitleTestefalseIdade22falseContentTypeItemfalseContentTypeId0x01000DC117894911AA4BB7ADE719F7B6C168false</Parameter><Parameter Type="Boolean">false</Parameter><Parameter Type="Null" /></Parameters></Method></ExceptionHandlingScopeSimple></Actions>
<ObjectPaths><StaticProperty Id="0" TypeId="{3747adcd-a3c3-41b9-bfab-4a64dd2f1e0a}" Name="Current" /><Property Id="2" ParentId="0" Name="Web" /><Property Id="4" ParentId="2" Name="Lists" /><Method Id="6" ParentId="4" Name="GetById"><Parameters><Parameter Type="String">84dbf580-a818-4904-a726-25fedc09e490</Parameter></Parameters></Method><Method Id="8" ParentId="6" Name="AddItem"><Parameters><Parameter TypeId="{54cdbee5-0897-44ac-829f-411557fa11be}"><Property Name="FolderUrl" Type="String">/Lists/TesteJMeter</Property><Property Name="LeafName" Type="Null" /><Property Name="UnderlyingObjectType" Type="Number">0</Property></Parameter></Parameters></Method></ObjectPaths>
</Request>

[no cookies]

Request Headers:

Cache-Control: no-cache

X-Requested-With: XMLHttpRequest

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:38.0) Gecko/20100101 Firefox/38.0

Referer: http://vmsp2013/Lists/TesteJMeter/NewForm.aspx?Source=http%3A%2F%2Fvmsp2013%2FLists%2FTesteJMeter%2FAllItems%2Easpx&RootFolder=

X-RequestDigest: 0xC756DFF038FC6A0D241D7203952F8545BC495084B8DCD4EB0171E88F15DD633F8590ADE4
C8749EDCDA73A9C48C8C8C8B515929E86CBBA83341187B3791F20F71,19 Oct 2015 18:14:37 -0000

Connection: keep-alive

Accept-Encoding: gzip, deflate

Pragma: no-cache

Accept-Language: en-US,en;q=0.5

Content-Length: 2508

Content-Type: text/xml; charset=UTF-8

 

Referência: https://msdn.microsoft.com/en-us/library/jj164022(office.15).aspx.

Abraço!

WebResource ASP.NET – Gerando URL diferente para cada servidor IIS

August 10, 2015 2 comments

Olá! Alegre

Cenário:

Imagine que você está desenvolvendo sua aplicação e ela requer diversos arquivos para funcionar, como: arquivos javascript, css, html, imagens, etc. Mas você não quer a solução final tenha diversos arquivos… Quer colocar toda a solução dentro de um único arquivo.

O WebResource (e o ScriptResource para versões mais atuais o .NET Framework) nos dão essa possibilidade. Assim, podemos compilar todos os arquivos de “apoio” dentro da DLL. Ou seja, o arquivo final será apenas uma DLL.

E os arquivos serão referenciados usando o WebResource. Já viram algumas aplicações que usam o WebResource.axd ou ScriptResource.axd seguido de uma longa QueryString?

Ex: http://<site>/WebResource.axd?d=7NnjFBcUeHcW9L9Vil_Xv8IVDbfvA_jo4F0ysa_kaopudWFLJ_17_kQ3sh-IDTrgjeEVswxCZAo-cYy0GgcvW-9WmDAYSrgwFIVHe3t4QVZpQk0CDLSpRoha_Cfp0zHEGsNVUg2&t=635745693347262797

O “d” é o parâmetro, criptografado, para o arquivo. O “t” é um timestamp usado para saber se o arquivo teve alteração ou não. São gerados automaticamente pelo .NET Framework.

image

image

image

ERRO:

Não é um erro, mas é um comportamento que precisamos contornar. Por padrão, o IIS vai usar a “MachineKey” autogenerated para montar a URL criptografada.

<machineKey validationKey="AutoGenerate,IsolateApps"

decryptionKey="AutoGenerate,IsolateApps"

validation="SHA1" decryption="Auto" />

Logo, em um ambiente com vários IIS em Load Balance, por exemplo, cada servidor irá gerar uma URL diferente para o “mesmo” recurso. Isso pode trazer problemas para ambientes que dependam do cache, pois como a URL muda, sempre irá fazer download.

Outros cenários podem ser afetados, como “robôs” de testes que são configurados com URLs. Quando o robô esperar uma URL, virá outra. Além de ViewState criptografada, session state e outros.

IIS 1:

clip_image002

IIS 2:

clip_image004

SOLUÇÃO:

Podemos “forçar” para que a URL criptografada seja sempre a mesma em todos os servidores IIS.

Para isso devemos configurar um valor para MachineKey no web.config da aplicação.

Na web existem alguns geradores de MachineKey. Tendo em mãos uma configuração de MachineKey (validationKey;decryptionKey), basta inserir no web.config da aplicação dentro da tag <system.web>.

Web.config:

clip_image006

IIS 1:

clip_image008

IIS 2:

clip_image010

NOTA: Atenção para os cenários de Cache, pois para que os arquivos sejam inseridos nas políticas de cache, o “compilation debug=’false’” não pode ser “true”.

https://support.microsoft.com/en-us/kb/2580348 – Debug Mode in ASP.NET Applications

“Scripts and images downloaded from the WebResource.axd and ScriptResource.axd handlers are not cached.”

“It is recommended that debug mode is always disabled in a production environment.”

Abraço!

Microsoft Office SharePoint Server (MOSS) 2007 e SQL Server 2012 são compatíveis?

Olá! Alegre

Cenário:

A equipe decidiu atualizar os servidores e migrar alguns servidores para as versões mais atuais. O MOSS 2007 iria continuar na versão 2007, mas em outro servidor. E o SQL 2005 iria para o SQL 2012.

ERRO:

Ao tentar configurar um nova farm no SQL 2012 temos a seguinte mensagem:

“sp_dboption is deprecated and no longer exists in the master database”

SOLUÇÃO:

Na verdade não chega a ser uma solução. O SQL Server 2012 não é suportado como opção para Banco de Dados do Microsoft Office SharePoint Server (MOSS) 2007.

Ou seja, precisamos atualizar também a versão do SharePoint 2007 para, pelo menos, SharePoint 2010 SP1, caso a utilização do SQL Server 2012 seja requisito. Caso contrário, temos que utilizar outra versão de SQL Server, por exemplo SQL Server 2008 R2 (que é a última versão suportada).

 

Referência: https://technet.microsoft.com/en-us/library/cc262485(v=office.12).aspx#section3 – Determine hardware and software requirements (Office SharePoint Server)

 

Important:

Office SharePoint Server 2007 does not support SQL Server 2012 or later versions of SQL Server.

 

Caso queira prosseguir, e mesmo sem suporte, utilizar o SQL Server 2012:

http://blog.sharepointrx.com/2013/12/22/installing-microsoft-office-sharepoint-server-2007-on-sql-server-2012/

Abraço!

Balanço Patrimonial – Modelo Inicial

January 8, 2015 Leave a comment

Este post estreia minha iniciativa de compartilhar meu aprendizado no mundo das finanças pessoais e, possivelmente, no mundo corporativo.

Alguns amigos ao me observarem religiosamente controlando minhas finanças, pedem conselhos, dicas e “modelos” que utilizo para gerenciar minhas despesas. Ajudo-os isoladamente, mas talvez possa alcançar mais pessoas por aqui. Alegre

Este é o primeiro, e talvez o mais simples, dos modelos. Até por que não é necessário atualizar todos os dias.

Balanço Patrimonial

Balanço Patrimonial é uma “fotografia” da situação financeira em uma determinada data. Faz muito sentido tirar uma fotografia a cada ano para responder algumas questões como:

  • Eu ganhei ou perdi dinheiro no ano passado?
  • Meu patrimônio tem crescido nos últimos anos?
  • Onde preciso melhorar minha situação financeira?

Esse conceito é mais comum no mundo corporativo para determinar o crescimento e/ou situação de uma empresa ano a ano.

Faz sentido ter uma fotografia anual, mas eu prefiro acompanhar mês a mês no sentido de sempre me manter alerta e controlar gastos, sabendo se eu posso ou não abusar deles.

Juntei um pouco dos meus controles financeiros, adicionei um pouco do conhecimento adquirido com os estudos dos livros e incrementei um pouco com conhecimento adquirido na pós em Finanças Corporativas. Resultado: Criei este primeiro modelo de “Balanço Patrimonial” e expus para alguns amigos… eles estão me ajudando a melhorar o modelo.

https://onedrive.live.com/redir?resid=D3436C90BCD36CB!10902&authkey=!AKSHGRHnukL-AKU&ithint=file%2cxlsx

Arquivo

O arquivo traz algum conceito “contábil” com os termos: Ativos, Exigível, Curto e Longo Prazo, Patrimônio Líquido, etc. Mas não se assuste, basta atualizar as células em AMARELO que as formulas farão o restante.

  • Sim, você pode atualizar a “descrição” do linha que contém o valor em AMARELO.

o clip_image002

O mais importante: o RESULTADO.

Após preencher os espaços em AMARELO, as fórmulas irão calcular os índices e teremos uma fotografia para o seu:

clip_image003

  • Índice de Liquidez: Sua capacidade de transformar ativos em dinheiro. (Para emergências, por exemplo)
  • Índice de Poupança: Sua capacidade de poupar e investir;
  • Índice de Endividamento: Quanto do seu ativo é, ou foi, financiado. No cenário corporativo, quando esse índice é elevado dizemos que a empresa está “alavancada”. Ou seja, está operando com muito recurso de terceiros (bancos, por exemplo). Quanto maior o índice, maior o risco;
  • Índice de Cobertura de Despesas Mensais: Se você perder o emprego, por quantos meses conseguirá sobreviver com seu ativo de curto prazo? Ou seja, por quantos meses sua poupança (dinheiro barato) com alta liquidez (capacidade de se transformar em dinheiro) irá mantê-lo até que você precise recorrer a empréstimos (dinheiro caro) ou outros fins?

Além de informações sobre o montante de seu patrimônio (PL – Patrimônio Líquido).

Conclusão

Estamos o começo do ano. Época em que fazemos planos e traçamos metas. Cenário ideal para iniciar e tomarmos controle de nossa finança pessoal!

Tenho, e utilizo, outros mecanismos de controle que pretendo organizar e compartilhar com vocês nos próximos posts. Qualquer dúvida, não hesite em perguntar!

Abraço!

SharePoint 2013 Configuration Wizard Missing Components Language Pack Installation

September 8, 2014 Leave a comment

Olá! J

Cenário:

 

Após aplicar o SP1 no SharePoint 2013 e também SP1 dos Language Pack instalados precisamos rodar o Configuration Wizard (PSCONFIG) para que o SharePoint consolide as atualizações realizadas. Mas, como nem tudo é como nós queremos nessa vida, tive alguns problemas para conseguir fazer com que o Configuration Wizard rodasse sem problemas.

 

ERRO:

 

Ao tentar rodar o Configuration Wizard era apresentado uma mensagem de erro informando que estavam faltando arquivos no SharePoint, embora eu já tivesse aplicado todos os pacotes de Language Pack e seus respectivos Service Pack.

 

“Some farm products and patches were not detected… Missing on <ServerName>”


SOLUÇÃO:

 

Procurando por problema similares na web, encontrei que isso poderia ocorrer por razão do serviço de timer parado, mas no meu caso estava rodando. De toda forma, reiniciei o serviço e tentei rodar novamente o Configuration Wizard. Sem sucesso.

 

O que resolveu foi rodar o seguinte cmdlet no powershell do SharePoint (SharePoint 2013 Management Shell) no servidor que ele apontava com “missing” (faltando) componente:

 

Get-SPProduct

 

Pronto! Ao término da execução deste cmdlet, tente rodar novamente o Configuration Wizard. Agora o SharePoint sabe que os componentes estão instalados e não deve reclamar mais a falta destes.

 

Abraço!