O processo de criação de um webservice para aceder ao contexto do Windows Sharepoint Services 3.0 é uma tarefa de certa forma complexa, terão de se efectuar um conjunto de passos que descrevo nos pontos seguintes:
- Criar Webservice
- Assinar a assembly e registar na gac
- Colocar assembly do webservice na virtual directory "bin" da web do sharepoint (por omissão C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin)
- Colocar .asmx na virtual directory "_vti_bin" da web do sharepoint (por omissão em C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\isapi)
- Usar a tool "Disco.exe"(por omissão em c:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin) sobre o asmx copiado no ponto anterior. Serão criados dois ficheiros na mesma pasta onde se encontra a tool Disco (exemplo ws.disco e ws.wsdl)
Por exemplo "disco http://localhost:2214/_vti_bin/ws.asmx" - Renomear os ficheiros disco e wsdl criados no ponto anterior para "Nome do webservice"disco.aspx e "Nome do webservice"wsdl.aspx
Por exemplo quando o webservice se chama ws.asmx, terão de se renomear para wsdisco.aspx e wswsdl.aspx - Abrir ficheiro wsdl e executar os seguintes passos:
- Substituir directiva xml (<?xml version="1.0" encoding="utf-8"?> ) por
<%@ 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"; %> - Onde está soap address, colocar a instrução seguinte
<soap:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> /> - Abrir ficheiro disco e executar o seguinte passo:
- Substituir directiva xml (<?xml version="1.0" encoding="utf-8"?> ) por
<%@ 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"; %> - Colocar o ficheiro disco e wsdl na mesma pasta do asmx (ponto 4)
- Na virtual directory _vti_bin da web do sharepoint (por omissão C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\isapi) no ficheiro spdisco.aspx acrescentar o seguinte
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/ws.asmx?wsdl"),Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/ws.asmx"),Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/ws.asmx?disco"),Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/" />
Nota, o que está a bold, substituir pelo nome do webservice - No projecto cliente, quando se faz a referencia para o webservice, deve-se colocar ?wsdl após o mesmo. Após a criação do proxy, deve-se verificar se o caminho para o webservice não conter o “?wsdl”
Para mais informações ir a Walkthrough: Creating a Custom Web Service.