Criando WCF Service para SharePoint 2013 – Tutorial

        Este post descreve a criação de um WCF Service e o deploy  na Farm do SharePoint 2013, no meu caso uso um StandAlone.

        O WCF Services desempenha um papel importante no modelo de desenvolvimento baseado no SharePoint 2013 Apps, atuando como uma ponte entre o SharePoint Client Object Model e o SharePoint Client Object Model.

        O Server Side Object Model  não está disponível para SharePoint 2013 Apps, isso quer dizer que qualquer operação ou requisito de negócios em uma aplicação deve ser executado somente Client Side Object Model (Microsoft.SharePoint.Client).

        Quem desenvolve para SharePoint já esta acostumado com esse cenário  e tem esse conceito bem enraizado.

Criando um WCF Service estamos violando o conceito de Modelo de Desenvolvimento de Aplicativos (SDK). Mas em certos momentos é necessário porque não existe outra maneira,   por exemplo, o SocialRatingManager. Não existe nenhuma classe CSOM equivalente a classe SocialRatingManager.

        Depois dessa introdução vou explicar o passo á passo para a criação de um serviço, bem simples!

Vamos lá hands on.

Crie um projeto do tipo SharePoint 2013 – Empty Project, defina um nome para seu projeto.

WCF1

wcf2

Adicione as seguintes referências, vamos usar ela nas nossa classes.

wcf3

Feito isso vamos mapear uma pasta do SharePoint, a pasta em questão será o LAYOUTS, onde nosso .svc será implementado.

wcf4

Neste passo vamos criar uma sub-pasta e renomeá-la como Service, e dentro desta pasta vamos adicionar um novo item do tipo texto e remomeá-lo para Service.svc.

wcf5

Dentro no nosso .svc vamos adicionar o seguinte trecho de código.

<%@ ServiceHost Language="C#" Debug="true"
    Service="GSD.WCFService.Bussiness.Services"
    Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressWebServiceHostFactory,
    Microsoft.SharePoint.Client.ServerRuntime, Version=15.0.0.0, Culture=neutral,
    PublicKeyToken=71e9bce111e9429c" %>

Esse trecho de código ainda não faz muito sentido…rs Para isso criar uma nova pasta chamada Bussiness onde colocaremos nossas classes responsável pela negocio do serviço. Dentro desta pasta vamos adicionar duas classes IServices.cs e Services.cs.

wcf6

Na classe IService iremos substituir tudo pelo código abaixo:

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
namespace GSD.WCFService.Bussiness
{
    [ServiceContract]
    public interface IServices
    {
        [OperationContract]
        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllLists()")]
        List<string> GetAllLists();
    }

}

Faremos o mesmo procedimento para a classe Services:

using System.Collections.Generic;
using System.ServiceModel.Activation;
using Microsoft.SharePoint;

namespace GSD.WCFService.Bussiness
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public sealed class Service : IServices
    {
        public List<string> GetAllLists()
        {
            List<string> list = new List<string>();
            using (SPSite site = new SPSite(SPContext.Current.Web.Url))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    SPListCollection colList = web.Lists;
                    foreach (SPList item in colList)
                    {
                        list.Add(item.Title);
                    }
                }
            }
            return list;
        }
    }
}

Antes de darmos continuidade vou explicar o que esse trecho de código faz, busco todas as lista da WebApp e adiciono em uma lista.

OK!

Agora vamos realizar o deploy de tudo isso que a gente fez até aqui, para isso selecione o projeto e vá em propriedades e mude o Deployment Target Property para  WebApplication.

Agora vamos testar no navegador para ser o que nosso serviço retorna.

http://wv2sbe02/axa/ecm/_layouts/15/GSD.WCFService/Services/Service.svc/GetAllLists()

Como havia mencionado acima este serviço ia retornar todas as listas da minha WebApp. Então seu retorno deve ser muito similar a este:
wcf8

Com essa simples explicação vocês já podem criar serviços e realizar o deploy na Farm do SharePoint.

Vlw por  hora é isso grande abraço!!

by GSD

Posted in .NET, SharePoint 2013, SharePoint Services, Uncategorized, Visual Studio 2015, WCF Services | Leave a comment

CSC.EXE Parou de Funcionar

Galera,

Este post será um dica rápida, estou desenvolvendo uma aplicação MVC, e no momento do debug a aplicação web cai, e fica aparecendo essa tela nos demais debug que eu tento executar.  Veja imagem abaixo, se for essa mensagem que aparece para você, então neste post temos a solução.

CSCError

Lendo no fórum da MSDN descobri que esse erro pode ser atribuído a arquivos ausentes ou corrompidos, entradas de registro inválidas associadas ao Csc.exe, ou seja, um erro muito genérico.

Enfim, o que resolveu meu problema foi deletar todos arquivos da pasta /bin! Se seu cenário for similar isso realmente resolve.

CSCError1

Todas vez que o erro ocorre, executo esse procedimento, esqueci de citar também que realizo Rebuild, mas isso é default…rs

Um grande abraço!

Posted in .NET, MVC, Visual Studio 2015 | Leave a comment

SharePoint + REST – Part 2

Olá Developers,

Essa é a segunda parte do assunto SharePoint + REST, na  Part 1, não abordei tudo a respeito da REST Query, então para mais informações podem acessar esse link:  REST Query .

Nesta segunda parte vamos trabalhar com os retornos das queries realizadas usando o serviço REST.

É muito simples então não vou entrar em muitos detalhes explicando trecho de código, mas caso surja dúvidas podem me deixar nos comentários.

Parti para estrategia de trazer tudo em uma tabela, veja o trecho de código abaixo:

 $.ajax({
        url: siteUrl + "/_api/web/lists/getbytitle('Projetos')/Items?$select=Title,Versao,Horas", //Coloca o URL 
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            var tabela = "<table border=1><tr>";
            tabela += "<th>Title</th>";
            tabela += "<th>Versão</th>";
            tabela += "<th>Horas</th></tr>";
            for (var i = 0; i < data.d.results.length; i++) {
                tabela += "<tr><td>" + data.d.results[i]["Title"] + "</td>";
                tabela += "<td>" + data.d.results[i]["Versao"] + "</td>";
                tabela += "<td>" + data.d.results[i]["Horas"] + "</td></tr>";
            }
            tabela += "</table>";
            $("#Grid").html(tabela);
        }
    });

 

Todo código html escrevi dentro do success, não impede de ser criadas function para a geração do html, sem problema algum.

Vejam o resultado que foi gerado na tela:

rest4

É isso ai galera!

Esse foi mais um post rápido, sempre que sobrar um tempinho vou compartilhando um pouco de conhecimento com vocês.

Um grande abraço.

Posted in Uncategorized, Search SharePoint 2013, SharePoint 2010, Rest, Rest SharePoint, Rest JQuery | Leave a comment

SharePoint + Rest – Part 1

Olá, aproveitando o meu post anterior, resolve falar um pouco de Rest api, os desenvolvedores front-end adoram essa api!

Caso alguém, antes de dar prosseguimento neste post não esteja iterado do assunto SharePoint + Rest, é só clicar no link.

Vamos lá vou esclarecer um ponto, este post funciona tanto para SharePoint 2010 e 2013, temos que nos atentar neste detalhe:

SP 2010 SP 2013
/_vti_bin/listdata.svc/ /_api/web/ ou /_vti_bin/listdata.svc/

Depois dessa informação, vamos para os códigos :).

Meus exemplos serão todos usando /_api/web/ !!!!

Eu gosto muito de usar o método $Ajax do JQuery:

$.ajax({
   url: url, //Coloca o URL 
   method: "GET",
   headers: { "Accept": "application/json; odata=verbose" },
   success: function (data) {
        console.log(data.d.results) //Imprime resultado no console do
                                    //navegador
   }
});
  • Selecionar todos items e todas colunas de uma lista 

Esta é a maneira mas simples de pegar os itens da lista:

/_api/web/lists/getbytitle('Projetos')/Items?$select=*

Na imagem abaixo, retornou todos os itens da minha lista e todas as colunas grifei as principais que usei no post anterior.

rest1

  • Selecionando itens e definindo colunas

Vamos selecionar os items da lista sem usar filtro, mas definiremos as colunas, é bem simples, veja o exemplo:

/_api/web/lists/getbytitle('Projetos')/Items?$select=Title,Versao,Horas

Vejam que retorna exatamente as colunas que foram selecionadas!

rest2

  • Selecionando itens, definindo colunas e usando filtro

Agora de fato faremos um busca mais apurada na lista passando filtros. 

/_api/web/lists/getbytitle('Projetos')/Items?$select=Title,Versao,Horas&$filter=Title eq 'Projeto 2'

Como no meu filtro tinha definido o ‘Projeto 2’, me retornou a minha seleção e as colunas definidas.

rest3

Galera, por hoje é só, fiz este post rapidinho devido ao tempo reduzido, mas logo faço uma parte-2, dando mais algumas dicas.

Abs 🙂

Posted in Rest, Rest JQuery, Rest SharePoint, SharePoint 2010, SharePoint 2013, Uncategorized | 1 Comment

Usando C3 JS + SharePoint 2013

Galera, já tinha muito tempo que queria compartilhar com vocês uma solução usando SharePoint e C3.JS. Acho essa api sensacional é muito valido usarmos ela para geração de gráfico, além de ser totalmente free e muito fácil de usar.

Vamos criar uma WebPart, muita gente fala mas solução nesse formato de .wsp irão sumir, não se usa mais, mas agora temos outro conceito de reutilizar e bla..bla…bla… kkkkkk

Concordo com todos comentários a este respeito, mas atualmente uso muito .wsp, por questão de politica da área de gerenciamentos de projetos na companhia que atuo como arquiteto.

Mãos a obra, primeiramente uma observação, quando código JS roda antes da página do SharePoint terminar o load, precisamos garantir que o JS seja carregado antes de executar no DOM, então usei esta função.

  function onReady(selector, callback) {
        var intervalID = window.setInterval(function () {
            if (document.querySelector(selector) !== undefined) {
                window.clearInterval(intervalID);
                callback.call(this);
            }
        }, 500);
    }

 

Agora vamos criar um WebPart, presumo que todos já saibam criar um WP no VS, caso não podem olhar esse link https://msdn.microsoft.com/en-us/library/ee231546.aspx.

Vejam como ficou meu meu projeto.

Chart_Solution

Segundo passo vamos adicionas as referências:

Chart_Reference

Como exemplo criei uma lista chamada projetos, onde vou mostrar os projetos -> Mês x Horas.

blogLista

Legal, agora vou explicar como fiz para manipular as informação de forma dinâmica, ou seja, como o JS conversou com nosso código C# localizado no UserControl.

A imagem abaixo é o .ascx, nele coloquei o c3 js, mas para que os valores fosses atualizado usei HiddenField.

Vejam que usei o c3 dentro da função onReady, para nosso gráfico renderizar sem problemas :).

blogCode

A seguir o ascx.cs, criei um código bem sim, pode ficar tranquilo que vou disponibilizar o fonte, no final.

blogCode1

É simples assim mesmo, vejam o resultado que bacana:

c3Blog

Bar

blogChart

Line

É isso pessoal, este post criei meio rápido, se ficou alguma dúvida pode deixar no comentários que logo responderei.

PS.:Não me esqueci do fonte segue o link:

GSD.ChartWithC3_JS

Posted in C3 JS, Chart SharePoint, SharePoint 2013, Visual Studio 2015, WebPart | Leave a comment

Realizando SELECT no SQL Server + SharePoint Solution

Opá que post é esse, isso não é nada aconselhável… Muitos devem estar falando isso, mas isso necessidade surgiu desse post aqui -> Problemas com a proc_ListUrls. Da uma lidinha nele vocês entenderam o problema que tive, e um problema da biblioteca Microsoft.SharePoint, ela funciona perfeitamente para uma Library ou List que possua poucos itens, mas no meus caso eram cerca 1,5 mi, só tive problemas e dor de cabeça, dai então realizei querys diretamente no banco, e ainda tive que criar novos índices, pois os criados não estavam performando nada, lógico que tive a ajuda de um DBA, pois não são especialista em SQL Server.

Mas vamos lá, você ao tentar criar um ConnectionString em um projeto SharePoint, pode ser um Projeto App, ou uma Solution, terá problemas ao tentar se conectar a base de dados do SharePoint.

Mas usando o método que criei isso não será o problema.

Da uma olhadinha:

public static SqlDataReader SelectTo(SqlConnection connection)
        {
            SqlDataReader reader = null;
            SPSecurity.RunWithElevatedPrivileges(delegate ()
            {
                using (SPSite ElevatedsiteColl = new SPSite(SPContext.Current.Web.Url))
                {
                    using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb())
                    {
                        try
                        {
                          
                            connection.Open();
                            SqlCommand cmdSelect = new SqlCommand(procGetItens, connection);
                            cmdSelect.CommandType = CommandType.StoredProcedure;
                            reader = cmdSelect.ExecuteReader();
                        }
                        catch (Exception ex)
                        {
                            reader = null;
                        }
                    }
                }
            });
            return reader;
        }

Realizando queries diretamente na base de dados consegui performar muito minha solução, antes o tempo para retorna uma busca era de 48 seg. com essa customização reduzi para 2 seg. é um ganho considerável.

Esse feature já esta no ar e o feedback dos usuários esta sendo muito positivo.

Abraços! Achei justo compartilhar esse case com vocês.

Posted in SharePoint, SharePoint 2007, SharePoint 2010, SharePoint 2013, WebPart | Leave a comment

SPFx – SharePoint Framework by GSD

Olá amigos,

Hoje vou falar um pouco da teoria do SPFx,  já foi divulgado pela Microsoft aqui no Brasil já tem uns 4 meses, mas só nessa última semana consegui criar alguns exemplos e estudar um pouco a respeito desse novo conceito, posts futuros já terão exemplos SPFx, podem acreditar, pois esta muito animador além de incentivar a aprender novas tecnologia .

Mas vamos falar um pouco do que é o SPFx, pessoal vou falar da minha visão e experiência que tive com essa novidade, o conceito não é muito inovador, pois no SharePoint Online já usávamos JS injetado na página e  SharePoint Add-in.

Para quem não mexeu ainda com SharePoint Online e também não tenha case dessa duas modalidades que citei acima vou falar brevemente um pouco de cada uma:

Adicionando Script no SP

É muito popular no SP Online a parte Web de editor de scripts que permite que colemos o código na página, o mesmo é executado quando a página é processada. É simples assim, chegar até ser rudimentar…Rs Convém lembrar que funciona muito bem. Ele é executado no mesmo contexto de navegador da página e está no mesmo DOM.

Modelo Add-in

É uma opção para sites NoScript, a para este tipo de site também usamos App-in. Esse modelo cria um _iFrame_where, ai que mora a desvantagem é difícil criar projetos responsivos e sei que é bem mais lento(experiência própria), mas não vou entrar nesse detalhe. Não poderia deixar de citar uma vantagem como é externa ao sistema e não tem acesso à  DOM / conexão, é mais fácil confiar e implementar.

SPFx 

Dei uma visão geral do atual cenário, agora vou falar da minha visão e o que o SPFx oferece para nós desenvolvedores.

O SharePoint Framework tenta construir  um sistema robusto de desenvolvimento em cima do SP local e SP On-line.

Segundo a idea inicial do SPFx ele se torna muito indicado, levantei alguns pontos consideráveis :

  • Ele é executado no contexto do usuário atual e conexão no navegador, e não em iFrames.
  • Os controles são processados no DOM de página normal.
  • Os controles são responsivos e acessíveis por natureza.
  • Há um ciclo de vida em que o desenvolvedor está envolvido.
    • Não é apenas renderizar , mas carregar , serializar _e _deserializar , alterações de configuração , etc.
  • A cadeia de ferramentas baseia-se em ferramentas comuns de desenvolvimento de cliente de código aberto, como npm, TypeScript, yeoman, webpack, gulp, etc.
  • Pode ser implantado em páginas web clássicas e de publicação, bem como nas páginas modernas.

Viram no penúltimo bullet apareceu algumas linguagem talvez não muito naturais para quem desenvolve em C# e Visual Studio.

Como disse que o SPFx se baseia em ferramentas de código aberto, esta uma boa oportunidade para desenvolver novas habilidades, acho que para desenvolvedores C#, typeScript é muito mais familiar, pelo menos no meu caso foi isso assim.

O modelo de dados não mudou absolutamente nada por isso elenco que TypeScript será uma transição quase nada traumática. Gente o REST continua a ser usado da mesma maneira também, se voce é acostumado a usar JSOM pode continuar usando, isso foi um exemplo para elucidar que nada alterou nesta parte também.

Não entrei em muitos detalhes pois o SPFx esta na primeira versão ainda, então falei um pouco da minha visão, espero ter ajudado neste ponto.

Que IDE usar ?

Como já esta envolvendo Open Source(Código Aberto) a escolha do IDE fica a critério do desenvolvedor, eu uso o VS Code, mas tem muitas opções.

Galera, acho que de uma maneira sucinta consegui exclarecer um pouco do SPFx SharePoint Framework. 

Posted in SharePoint Framework, SPFx, Visual Studio Code | Leave a comment