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
Sem comentários: