Arquivo da categoria: Desenvolvimento

Criar uma HighTrust SharePoint App

Olá SharePointers, 

Nesse post vou falar como criar um High-Trust SharePoint App.

Antes de mais nada, é importante entender o seguinte:

  • High-Trust não é igual a Full-Trust.
  • Esse tipo de App não pode ser instalado no SharePoint Online.
  • Esse tipo de App utiliza um Certificado para estabelecer a confiança entre o SharePoint e a Web Application do App.

 

Quando você cria um “Low Trust” App, o Azure ACS serve como servidor de Autorização. Mas, quando você está nesse modelo de HighTrust, o próprio App é o servidor de autorização.

 

Basicamente, o processo é o seguinte:

  1. O usuário acessa o SharePoint
  2. O servidor do SharePoint responde com a página, caso o usuário tenha acesso
  3. O Usuário clica no App.
  4. O App se comunica com o SharePoint para ver se um confia no outro.
  5. Caso exista a confiança entre eles, o App é autorizado a acessar o SharePoint
  6. A resposta da transação é apresentada para o usuário

 

Para visualizar o passo-a-passo, acessem o projeto no GitHub (onde o código-fonte está disponível): https://github.com/RARomano/HighTrustSharePointApps

 

Referências:

https://msdn.microsoft.com/en-us/library/office/fp179901.aspx

https://msdn.microsoft.com/en-us/library/office/jj945118.aspx

http://blogs.msdn.com/b/shariq/archive/2013/05/07/how-to-set-up-high-trust-apps-for-sharepoint-2013-amp-troubleshooting-tips.aspx

https://msdn.microsoft.com/en-us/library/office/dn790706.aspx

 

 

 

SharePoint 2013 e seus modelos de desenvolvimento

Olá SharePointers,

Passando por alguns projetos recentes e após várias dúvidas comuns a profissionais do ramo, resolvi escrever um post sobre o assunto.

Com a introdução do SharePoint 2013, a Microsoft nos apresentou um recurso muito interessante: Apps for SharePoint. Durante todo o tempo em que esse conceito era apresentado para nós, era comum notarmos que a mensagem que era divulgada é “Apps é o futuro”.

Após esse período inicial, quando todos começaram a trabalhar com o produto, notamos uma grande resistência da comunidade em utilizá-lo. Para mais informações sobre como criar componentes reutilizáveis no SharePoint, veja: https://msdn.microsoft.com/en-us/library/office/jj163953(v=office.15).aspx.

Entretanto, nós profissionais, devemos filtrar a mensagem e entender o que está por trás disso tudo: Office 365. A Microsoft tem investido cada vez mais em sua plataforma de nuvem e é natural que ela concentre os seus esforços em sua “menina dos olhos”. Dessa forma, com os “famosos” apps, ela consegue resolver um problema crítico em um cenário de nuvem (com ambiente compartilhado entre os clientes): permitir que cada cliente possa customizar o seu espaço sem interferir nos demais e não ter um time para validar cada pacote, antes de ser colocado no ambiente SharePoint, para garantir que ele não contenha nenhuma operação potencialmente perigosa para o ambiente.

Com os apps não perdemos o nosso poder de customização e não dependemos de algum IT Pro para instalar, gerenciar os Change Requests no ambiente e potencialmente causar indisponibilidade no mesmo. Fantástico, não? 😀

Sendo assim, a Microsoft conseguiu criar um ambiente muito mais estável e gerenciável, permitindo entregar muita qualidade e evitando que um cliente degrade performance de outro. Combinação matadora para um ambiente de nuvem.

E quem não utiliza essa plataforma e ainda prefere/quer investir em sua plataforma on-premises?

Embora para alguns casos o modelo de Apps possa ser utilizado também, por exemplo em ambientes muito controlados onde customizações não são permitidas, esse modelo é super válido. Permite agregar valor para o usuário de forma rápida e, ainda em uma futura migração de versões do produto, é bem fácil migrar a solução.

Em um cenário onde você tem outras alternativas de desenvolvimento, como farm solutions, avaliá-las pode e deve fazer parte das atividades dos arquitetos de sistema. Escrevi um post uma vez comparando Farm Solutions com Apps (SharePoint 2013 : Farm Solution x Apps), ele aborda os detalhes técnicos com mais detalhes.

Mas, para um time que já investiu tempo (e dinheiro) criando uma série de framework e utilitários para farm solutions, não vale a pena investir esforço migrar para esse modelo novo (a não ser que tenha previsão de migrar para o Office 365 um dia). Além de termos muito mais controle com Farm Solutions, conseguimos evitar alguns comportamentos, na minha opinião, estranhos. Exemplo:

Utilizando REST APIs, ao referenciarmos um campo, devemos utilizar o Display Name do campo sem espaços; Se o campo tem o InternalName: NomePai e o Display Name: Nome do Pai, devo utilizar NomedoPai. Se o display name desse campo mudar, tem que alterar o código..

Não posso deixar de comentar que o investimento que a Microsoft está fazendo em APIs client é absurdo, buscando chegar no mesmo nível do Server Object Model. No mundo ideal, todas as APIs que temos disponíveis no lado do server estará disponível no Client. 🙂

A própria adição do “JSLink” (https://msdn.microsoft.com/en-us/magazine/dn745867.aspx) é sensacional.

Além disso, para uma farm on-prem suportar o modelo de Apps, é necessário realizar uma série de configurações adicionais no ambiente (inclusive no DNS – https://technet.microsoft.com/en-us/library/fp161236(v=office.15).aspx).

Autenticação não funcionará com Kerberos. É impossível lidar com tantas URLs diferentes que são geradas quando utilizamos Apps.

É muito rápido e fácil criar customizações server-side. Em pouco tempo estamos com uma solução pronta para utilização do usuário.

 

Para mim, sempre que possível, o modelo de desenvolvimento para ambientes on-prem é através de Farm Solutions.

 

Para ajudar na decisão de qual modelo escolher, recomendo a leitura desse link: https://msdn.microsoft.com/en-us/library/office/dn268593(v=office.15).aspx

Essa é uma discussão bem longa, gostaria de saber mais de vocês que utilizam o SharePoint no dia-a-dia. O que acham desse assunto? Qual modelo de desenvolvimento utilizam e porquê?

 

TimerJob – Como controlar a barra de progresso?

Olá SharePointers,

Já postei algumas vezes sobre TimerJobs nesse blog (posts Regular TimerJob e Work Item TimerJobs e Criando Custom Timer Jobs no SharePoint) entretanto, existe um mecanismo muito pouco utilizado que serve de barra de progresso para a execução do seu TimerJob.

Para fazer esse controle, utilizarei o mesmo template criado no post Criando Custom Timer Jobs no SharePoint e só adicionarei os controles necessários.

Na documentação do MSDN, vemos que a classe SPJobDefinition expõe um método para essa operação SPJobDefinition.UpdateProgress. Dessa forma, só precisamos chamá-lo passando um número até 100 que indica o percentual de progresso.

O que nos resta é gerar um cálculo para identificar o progresso atual. Isso é mais fácil né?

Abaixo um exemplo:

public override void Execute(Guid contentDbId) { int[] collection = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int count = 0; foreach (var item in collection) { Thread.Sleep(5000); count++; this.UpdateProgress((count * 100) / collection.Length); } }

 

Após fazer o deploy, e executar o TimerJob, é possível acompanhar sua execução na URL http://URL_DA_CENTRAL_ADMIN/_admin/ServiceRunningJobs.aspx.

Você deverá ver algo como os prints abaixo:

 

image

 

image

 

URL para fazer o download da solução utilizada nesse exemplo: http://1drv.ms/1vVYIJ9

 

Abraços!

SharePoint Apps: Como utilizar o People Picker?

Olá SharePointers,

Hoje vou falar sobre como utilizar o People Picker quando estamos desenvolvendo uma app para SharePoint.

O primeiro passo, é carregar os scripts que serão utilizados (ver imagem abaixo) e colocar a div quer será utilizada para criação do controle dinamicamente.

image

 

Após a criação dos controles acima, basta colocar o código abaixo em um arquivo .js e adicioná-lo a página como referência que o People Picker funcionará perfeitamente.

 

// Run your custom code when the DOM is ready. $(document).ready(function () { // Specify the unique ID of the DOM element where the // picker will render. initializePeoplePicker('peoplePickerDiv'); }); // Render and initialize the client-side People Picker. function initializePeoplePicker(peoplePickerElementId) { // Create a schema to store picker properties, and set the properties. var schema = {}; schema['PrincipalAccountType'] = 'User,DL,SecGroup,SPGroup'; schema['SearchPrincipalSource'] = 15; schema['ResolvePrincipalSource'] = 15; schema['AllowMultipleValues'] = true; schema['MaximumEntitySuggestions'] = 50; schema['Width'] = '280px'; // Render and initialize the picker. // Pass the ID of the DOM element that contains the picker, an array of initial // PickerEntity objects to set the picker value, and a schema that defines // picker properties. this.SPClientPeoplePicker_InitStandaloneControlWrapper(peoplePickerElementId, null, schema); } // Query the picker for user information. function getUserInfo() { // Get the people picker object from the page. var peoplePicker = this.SPClientPeoplePicker.SPClientPeoplePickerDict.peoplePickerDiv_TopSpan; // Get information about all users. var users = peoplePicker.GetAllUserInfo(); var userInfo = ''; for (var i = 0; i < users.length; i++) { var user = users[i]; for (var userProperty in user) { userInfo += userProperty + ': ' + user[userProperty] + '<br>'; } } $('#resolvedUsers').html(userInfo); // Get user keys. var keys = peoplePicker.GetAllUserKeys(); $('#userKeys').html(keys); // Get the first user's ID by using the login name. getUserId(users[0].Key); } // Get the user ID. function getUserId(loginName) { var context = new SP.ClientContext.get_current(); this.user = context.get_web().ensureUser(loginName); context.load(this.user); context.executeQueryAsync( Function.createDelegate(null, ensureUserSuccess), Function.createDelegate(null, onFail) ); } function ensureUserSuccess() { $('#userId').html(this.user.get_id()); } function onFail(sender, args) { alert('Query failed. Error: ' + args.get_message()); }

Bem simples, não acharam?

 

Abraços! 😀

 

Referência

http://msdn.microsoft.com/en-us/library/jj713593.aspx

Troubleshooting SharePoint/Office365: Sideloading of apps is not enabled on this site

Olá SharePointers,
Estava desenvolvendo uma SharePoint Hosted app para o Office 365 e, para minha surpresa, apareceu o erro abaixo.
Esse erro acontecia quando quando tentava fazer o deploy via Visual Studio.

 

Para resolver esse erro, basta rodar o script que está disponível nesse link: http://1drv.ms/1qDs0oy

 

Referência:

http://blogs.msdn.com/b/officeapps/archive/2013/12/10/enable-app-sideloading-in-your-non-developer-site-collection.aspx

Abraços! 😀

SharePoint e Javascript – Amor ou ódio?

Olá SharePointers,

Javascript e suas bibliotecas assumem um papel cada vez mais relevante na vida de um desenvolvedor moderno. É comum encontrar pessoas que digam que atualmente é uma das “linguagens” mais importantes para um desenvolvedor de SharePoint. Sei que esse ponto é controverso, mas esse é um tema que está cada vez mais presente no nosso dia-a-dia.

Notamos que a Microsoft fez um grande esforço para “mudar” um pouco a nossa cabeça e colocou no SharePoint 2013 o conceito de Apps, que, de uma forma bem simplista, é HTML e JavaScript.

Para quem ainda não está familiarizado, David Mann (SharePoint MVP – EUA) fez um curso muito interessante no Pluralsight: http://pluralsight.com/training/Courses/TableOfContents/developing-sharepoint-2013-javascript.

O SharePoint contém uma quantidade enorme de funções prontas que podem ser reutilizadas para nos ajudar durante o desenvolvimento de alguma solução. Algumas delas não estão documentadas no MSDN.

Para ajudar no desenvolvimento, existem alguns plugins para o Visual Studio. Dentre eles, recomendo esse aqui: http://visualstudiogallery.msdn.microsoft.com/288a2b0f-1357-47b4-8215-1134c36bdf30

Voltando ao código, vou citar algumas funções que podem ajudar bastante no desenvolvimento e não estão documentadas em lugar nenhum:

  • url = SP.Utilities.UrlBuilder.replaceOrAddQueryString(url, key, value): Esse método recebe uma URL e modifica ou inclui um parâmetro na QueryStrig. O Retoro é a URL modificada.
  • url = SP.Utilities.UrlBuilder.removeQueryString(url, key): Esse método remove um parâmetro da query string (e seu valor) de uma URL.
  • url = SP.Utilities.UrlBuilder.urlCombine(url1, url2): Combina duas URLs e garante que não tenha nenhuma “/” redundante.

 

O ideal, antes de sair desenvolvendo, é pensar se o que precisamos fazer não existe no SharePoint. E, se existir, tentar entender como ele realiza tal operação e fazermos do mesmo jeito.

Referências Adicionais

http://msdn.microsoft.com/en-us/library/office/ee549589(v=office.14).aspx

http://chuvash.eu/2012/01/24/parameterize-an-javascript-object-and-create-url/

http://www.wictorwilen.se/Post/Working-with-URLs-in-SharePoint-2010-JavaScripts.aspx

 

Abraços!