Consumo de serviço web por componente COM


Apresenta-se uma solução para consumo de web service de tecnologia .NET Framework 2.0 por componente COM para tipos complexos.

Pré-requisitos
  • Projecto .NET do tipo biblioteca
  • Selecção a opção "Make assembly COM-Visible" na "Assembly Information" da biblioteca
  • Selecção da opção "Register for COM interop" para ambiente de desenvolvimento compatível com projectos COM
  • Adição ao projecto da referência web (Web Reference) para geração de código baseado nos web services da .NET Framework 2.0


Exemplo: Obtenção de documento em formato binário a partir de plataforma de Gestão Documental e gravação em sistema de ficheiros para consumo por aplicação externa.


Proxy para sistema remoto

public class SGDDocument
{
  public SGDDocument() { }

  public SGDWebService.HeaderType headerType { get; set; }
  public SGDWebService.GetDocContentBody docContentBody { get; set; }

  public string Url { get; set; }

  public string Get()
  {

  SGDWebService.GetDocContent doc = new SGDWebService.GetDocContent();
  doc.Header = headerType;
  doc.Body = docContentBody;

  SGDWebService.SGDWebService_V3HttpService service = new SGDWebService.SGDWebService_V3HttpService();
  service.Url = Url;

  SGDWebService.GetDocContentResponse docContentResponse = service.GetDocContent(doc);

  SGDWebService.GetDocContentBodyResponse docContentBodyResponse = docContentResponse.Body;

  string type = docContentBodyResponse.Type;

  SGDWebService.DocContentType docContext = docContentBodyResponse.ContextData as SGDWebService.DocContentType;
  SGDWebService.SuccessDataType successData = docContentBodyResponse.Item as SGDWebService.SuccessDataType;

  if ("E".Equals(type))
  {
  SGDWebService.ErrorDataType errorData = docContentBodyResponse.Item as SGDWebService.ErrorDataType;
  return string.Format("Ocorreu um erro na obtenção do documento: {0} {1}.", 
      errorData.Title.GetValue(0).ToString(), errorData.Detail.GetValue(0).ToString());
  }

  string dirFicheiro = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, docContext.DocFileName);
  File.WriteAllBytes(dirFicheiro, docContext.DocContent);

  return dirFicheiro;
  }

}

COM Consumer/Wrapper function

Public Function GetDocContent(ByVal FileID As Double) As String
Dim SGDDocument As SGDService.SGDDocument
Dim headerType As SGDService.headerType
Dim getDocContentBody As SGDService.getDocContentBody

Dim docFullName, destFullName As String
Dim guid1, guid2 As String

On Error GoTo errHandler

guid1 = Trim$(GetGUID())
guid1 = Mid(guid1, 2, Len(guid1) - 3)

guid2 = Trim$(GetGUID())
guid2 = Mid(guid2, 2, Len(guid2) - 3)

Set headerType = New SGDService.headerType

headerType.Version = <version>
headerType.TimeStamp = DateTime.Now
headerType.MessageGuid = guid1
headerType.GeneratorEntity = <Entity>
headerType.GeneratorApplication = <Application>
headerType.ServiceId = "<webservice>/GetDocContent"
headerType.InternalId = guid2

''Operation Input Parameteres (in this example)
Set getDocContentBody = New SGDService.getDocContentBody

getDocContentBody.Conversion = 1
getDocContentBody.DocID = CStr(FileID)
getDocContentBody.docPage = 0
getDocContentBody.system_name = <Document Management System Name>

''Prepare call to service proxy
Set SGDDocument = New SGDService.SGDDocument
Set SGDDocument.headerType = headerType
Set SGDDocument.docContentBody = getDocContentBody

SGDDocument.Url = <SGD_WEBSERVICE_URL>

''Get Document from service proxy
docFullName = SGDDocument.Get()

''Save document to working directory
destFullName = BuildPath(gsWorkDir, GetFileName(docFullName))

MoveFile docFullName, destFullName

GetDocContent = destFullName

Exit Function
errHandler:

''Error Handling TODO

  GetDocContent = vbNullString

End Function

Invocação

Dim strFileC As String

''Get document using encapsulation
strFileC = GetDocContent(<FileDocID>)

Debug.Print strFileC

XML definido na norma para desenho e implementação do serviço

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:serv="http://www.dummyComp.pt/TargetWebService" xmlns:comp="http://www.dummyComp.pt/DummyCompService">
<soapenv:Header/>
<soapenv:Body>
<serv:GetDocContent>
<Header>
<acor:Version>1</acor:Version>
<acor:TimeStamp>2013-10-01T16:07:03.388Z</acor:TimeStamp>
<acor:MessageGuid>25892e17-80f6-415f-9c65-7395632f0223</acor:MessageGuid>
<acor:GeneratorEntity>MyEntity</acor:GeneratorEntity>
<acor:GeneratorApplication>MyApplication</acor:GeneratorApplication>
<acor:ServiceId>TargetWebService/GetDocContent</acor:ServiceId>
</Header>
<Body>
<system_name>DocumentManagementSystemName</system_name>
<docId>286284628</docId>
<docPage>0</docPage>
<conversion>0</conversion>
</Body>
</serv:GetDocContent>
</soapenv:Body>
</soapenv:Envelope>

Registo da assembly para interacção com componentes COM

C:\windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe WebServiceProxy.dll /tlb:WebServiceProxy.tlb

Cancelar registo da assembly

C:\windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /unregister WebServiceProxy.dll

Licença CC BY-SA 4.0 Silvia Pinhão Lopes, 26.6.17
Print Friendly and PDF

Sem comentários:

Com tecnologia do Blogger.