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:

  1. Criar Webservice
  2. Assinar a assembly e registar na gac
  3. Colocar assembly do webservice na virtual directory "bin" da web do sharepoint (por omissão C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin)
  4. 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)
  5. 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"
  6. 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
  7. Abrir ficheiro wsdl e executar os seguintes passos:
    1. 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"; %>
    2. Onde está soap address, colocar a instrução seguinte
      <soap:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> />

  8. Abrir ficheiro disco e executar o seguinte passo:
    1. 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"; %>

  9. Colocar o ficheiro disco e wsdl na mesma pasta do asmx (ponto 4)
  10. 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
  11. 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here