terça-feira, 31 de maio de 2011

Como criar um web service e integrá-lo com um web site de Sharepoint?

Por vezes necessitamos que um web site Sharepoint comunique com um web service construído à medida e queremos que esse web service esteja acoplado ao próprio site, possibilitando a criação de um único pacote para instalação fácil de todo o projecto. Como é possível realizar isso?

Ferramentas a utilizar:
• Visual Studio 2008/2010
• .NET Framework Web Service Discovery Tool (Disco.exe)
• WSPBuilder


Criar um web service ASP.Net

1. Abrir a solução do web site Sharepoint, a que se pretende adicionar o web service, e adicionar um novo projecto do tipo “ASP.Net Web Service Application”;

2. Assinar o projecto, criando um strong name para possibilitar a inclusão da dll deste na GAC;

3. Adicionar ao projecto todas as referências que serão necessárias no nosso web service, fazer build e colocar a dll resultante na GAC.


Após estes passos será necessário alterar a informação do assembly presente no ficheiro .asmx do web service (por defeito é o ficheiro Service1.asmx), adicionando a informação da dll. Para isso será necessário:

1. Abrir a GAC e verificar as propriedades da dll, tomando nota da public key desta;

2. Abrir o ficheiro .asmx e remover o atributo CodeBehid que se encontra presente na directiva de página do ficheiro. Ou seja, retirar a parte que se encontra marcada a negrito no seguinte exemplo:
<%@ WebService Language="C#" CodeBehind="Service1.asmx.cs" Class="WebService.Service1" %>

3. Alterar o conteúdo do atributo Class de acordo com o exemplo seguinte, sendo que NomeDaClasse deverá ser substituído pelo nome da classe (incluíndo o namespace), NomeDoAssembly deverá ser substituído pelo nome da dll e ChaveDoAssembly deverá ser substituído pela public key da dll:
<%@ WebService Language="C#" Class=" NomeDaClasse, NomeDoAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ChaveDoAssembly" %>

4. Repetir estes passos para todos os ficheiros .asmx e guardar todas as alterações.


Gerar e modificar os ficheiros Static Discovery e WSDL

Devido ao Sharepoint virtualizar os URLs, não é possível utilizar os ficheiros .disco e .wsdl criados automaticamente pelo ASP.NET. Sendo assim é preciso criar estes dois ficheiros com a informação que mantém a virtualização do Sharepoint.
Para isso será necessário utilizar a ferramenta Disco.exe e seguir os seguintes passos:

1. Copiar o ficheiro .asmx para a directoria \Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS

2. Abrir uma command prompt do Vistual Studio e navegar até à directoria indicada, utilizando de seguida o comando (onde NomeFicheiro dever ser alterado para o nome do ficheiro .asmx):
disco http://localhost/_layouts/NomeFicheiro.asmx

3. Serão então criados os ficheiros .disco e .wsdl que, contudo, ainda terão de ser alterados;

4. Será necessário abrir os dois ficheiros (.disco e .wsdl) e registar o namespace do Sharepoint object model. Para isso bastará substituir a linha
<?xml version="1.0" encoding="utf-8"?>
pelas seguintes:
<%@ Page Language="C#" Inherits="System.Web.UI.Page" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>

5. O ficheiro .disco necessita ainda de algumas alterações, sendo necessário substituir as chaves contractRef e soap address pelo seguinte:
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />

<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q1="http://tempuri.org/" binding="q1: ServiceSoap1" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap2" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

6. No ficheiro .wsdl devem ser alteradas as chaves soap:address e soap12:address para as seguintes linhas:
<soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />

<soap12:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />

7. Renomear ambos os ficheiros (.disco e .wsdl) com o respectivo formato:
NomeServicodisco.aspx e NomeServicowsdl.aspx


Adicionar os ficheiros ao projecto de instalação criado com WSPBuilder

1. No projecto onde se encontra a solução Sharepoint (.wsp) criada com o WSPBuilder deverá ser adicionada uma nova directoria (12\ISAPI), para onde os três ficheiros (NomeServico.asmx, NomeServicowsdl.aspx e NomeServicodisco.aspx) obtidos nos passos anteriores deverão ser copiados;

2. O projecto “ASP.NET Web Service Application” deverá ser referenciado também neste projecto, de modo a garantir que o WSPBuilder incluí a dll do web service.


Após estes passos bastará criar um novo ficheiro .wsp e realizar o deploy da aplicação para o servidor, para que o web service seja colocado no Sharepoint e fique disponível para o nosso site.
Para aceder ao web service bastará utilizar o seguinte url, onde servidor deverá ser substituído pelo endereço do servidor (incluir porta, se necessário) e service deverá ser substituído pelo nome do serviço:
http://servidor/_vti_bin/service.asmx

Notas:
• É possível “bloquear” o web service de modo a que responda apenas quando é chamado a partir de um determinado endereço;
• Caso o web service necessite de um ficheiro de configuração, para guardar alguma chave, poderá ser utilizado o ficheiro de configuração (web.config) do website Sharepoint.

Sem comentários: