OBJECT Codeunit 92600 Generic SOAP Client { OBJECT-PROPERTIES { Date=04/12/16; Time=12:00:00; Modified=Yes; Version List=GWS; } PROPERTIES { OnRun=BEGIN END; } CODE { VAR Client@1009 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type" WITHEVENTS; Method@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo" WITHEVENTS; AuthenticationType@1002 : 'Default,Windows,User/Password'; UserPasswordError@1011 : TextConst 'ENU=Please set a user and a password in order to continue.'; UserName@1004 : Text; Password@1003 : Text; PROCEDURE InitClient@4(_Wsdl@1003 : Text;_SoapVersion@1004 : 'SOAP,SOAP12';_UserName@1000 : Text;_Password@1001 : Text;_AuthenticationType@1002 : 'Default,Windows,User/Password'); BEGIN UserName := _UserName; Password := _Password; AuthenticationType := _AuthenticationType; IF NOT TryGenerateCSharpCode(_Wsdl, _SoapVersion, AuthenticationType, UserName, Password) THEN ERROR(GETLASTERRORTEXT); END; PROCEDURE InitCallMethod@13(_MethodName@1000 : Text;_Arguments@1001 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array"); VAR Parameters@1003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array"; Object@1002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object"; BEGIN Method := Client.GetMethod(_MethodName); Parameters := Method.GetParameters(); _Arguments := _Arguments.CreateInstance(GETDOTNETTYPE(Object), Parameters.Length); END; PROCEDURE CallMethod@24(_Arguments@1000 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";_ReturnObject@1002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object"); VAR Activator@1003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Activator"; ServiceInstance@1001 : DotNet "'System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Protocols.SoapHttpClientProtocol"; BEGIN IF NOT ISNULL(Client) AND NOT ISNULL(Method) AND NOT ISNULL(_Arguments) THEN BEGIN ServiceInstance := Activator.CreateInstance(Client); Authenticate(ServiceInstance, AuthenticationType, UserName, Password); _ReturnObject := Method.Invoke(ServiceInstance, _Arguments); END; END; PROCEDURE GetMethods@6(VAR _MethodList@1006 : ARRAY [100] OF Text[100];VAR _ParameterList@1000 : ARRAY [100,100] OF Text[100]) Defenitions : Text; VAR Methods@1009 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array" WITHEVENTS; Method@1003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo"; Parameters@1008 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array"; Parameter@1007 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.ParameterInfo"; ParmeterName@1005 : Text; ParameterType@1004 : Text; i@1002 : Integer; j@1001 : Integer; BEGIN IF NOT ISNULL(Client) THEN BEGIN Methods := Client.GetMethods(); FOREACH Method IN Methods DO BEGIN IF IsWebServiceMethod(Method) THEN BEGIN i += 1; Defenitions += Method.Name + '('; Parameters := Method.GetParameters(); CLEAR(ParmeterName); FOREACH Parameter IN Parameters DO BEGIN j += 1; _ParameterList[i][j] := Parameter.Name; IF ParmeterName <> '' THEN ParmeterName += ', '; ParmeterName += FORMAT(Parameter.ParameterType) + ' : ' + Parameter.Name; END; Defenitions += ParmeterName + ') : '+ FORMAT(Method.ReturnType) +'\'; _MethodList[i] := Method.Name; END; END; END; END; [TryFunction] LOCAL PROCEDURE TryGenerateCSharpCode@2(_Wsdl@1017 : Text;_SoapVersion@1025 : 'SOAP,SOAP12';_AuthenticationType@1012 : 'Default,Windows,User/Password';_UserName@1024 : Text;_Password@1023 : Text); VAR webRequest@1000 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.WebRequest"; webResponse@1001 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.WebResponse"; description@1002 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Description.ServiceDescription"; importer@1004 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Description.ServiceDescriptionImporter"; style@1008 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Description.ServiceDescriptionImportStyle"; codeGenerationOptions@1022 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.Serialization.CodeGenerationOptions"; nmspace@1005 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.CodeNamespace"; unit@1006 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.CodeCompileUnit"; warning@1007 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Description.ServiceDescriptionImportWarnings"; provider@1020 : DotNet "'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.Microsoft.CSharp.CSharpCodeProvider"; string@1021 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String"; assemblyReferences@1009 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array"; parms@1010 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerParameters"; compilationUnits@1033 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array"; WebException@1013 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.WebException"; HttpStatusCode@1018 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpStatusCode"; ResponseHeaders@1016 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Specialized.NameValueCollection"; CSharpCode@1003 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerResults" WITHEVENTS; Service@1028 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Description.ServiceDescription"; HttpWebRequestMgt@1014 : Codeunit 1297; WebRequestHelper@1015 : Codeunit 1299; NavInstream@1019 : InStream; ServiceURL@1026 : Text; BEGIN webRequest := webRequest.Create(_Wsdl); webRequest.UseDefaultCredentials := TRUE; HttpWebRequestMgt.CreateInstream(NavInstream); IF NOT WebRequestHelper.GetWebResponse(webRequest, webResponse, NavInstream, HttpStatusCode, ResponseHeaders, FALSE) THEN WebRequestHelper.GetWebResponseError(WebException, ServiceURL); description := description.ServiceDescription(); description := description.Read(NavInstream); Service := description.Services.Item(0); importer := importer.ServiceDescriptionImporter(); importer.ProtocolName := FORMAT(_SoapVersion); importer.AddServiceDescription(description, '', ''); importer.Style := style.Client; importer.CodeGenerationOptions := codeGenerationOptions.GenerateProperties(); nmspace := nmspace.CodeNamespace(); unit := unit.CodeCompileUnit(); unit.Namespaces.Add(nmspace); warning := importer.Import(nmspace, unit); IF warning = 0 THEN BEGIN provider := provider.CSharpCodeProvider(); assemblyReferences := assemblyReferences.CreateInstance(GETDOTNETTYPE(string), 5); assemblyReferences.SetValue('System.dll', 0); assemblyReferences.SetValue('System.Web.Services.dll', 1); assemblyReferences.SetValue('System.Web.dll', 2); assemblyReferences.SetValue('System.Xml.dll', 3); assemblyReferences.SetValue('System.Data.dll', 4); parms := parms.CompilerParameters(assemblyReferences); parms.GenerateInMemory := TRUE; compilationUnits := compilationUnits.CreateInstance(GETDOTNETTYPE(unit), 1); compilationUnits.SetValue(unit, 0); CSharpCode := provider.CompileAssemblyFromDom(parms, compilationUnits); IF CSharpCode.Errors.Count = 0 THEN Client := CSharpCode.CompiledAssembly.GetType(Service.Name) ELSE ERROR('Compilation error: %1', CSharpCode.Errors.Item(0)); END; END; LOCAL PROCEDURE Authenticate@18(VAR _ServiceInstance@1001 : DotNet "'System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Protocols.SoapHttpClientProtocol";_AuthenticationType@1005 : 'Default,Windows,User/Password';_UserName@1003 : Text;_Password@1004 : Text); VAR Credential@1002 : DotNet "'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.NetworkCredential"; CredentialCache@1000 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.CredentialCache"; BEGIN CASE _AuthenticationType OF _AuthenticationType::Default: _ServiceInstance.UseDefaultCredentials := TRUE; _AuthenticationType::Windows: BEGIN CredentialCache := CredentialCache.CredentialCache(); _ServiceInstance.Credentials := CredentialCache.DefaultNetworkCredentials; END; _AuthenticationType::"User/Password": BEGIN IF (_UserName = '') OR (_Password = '') THEN ERROR(UserPasswordError); _ServiceInstance.Credentials := Credential.NetworkCredential(_UserName, _Password); END; END; END; PROCEDURE GetObjectValue@54(_NodeName@1000 : Text;_Source@1003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object") : Text; VAR PropertyInfo@1001 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.PropertyInfo"; Object@1002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object"; Type@1004 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type"; BEGIN IF ISNULL(_Source) THEN EXIT(''); Type := _Source.GetType(); PropertyInfo := Type.GetProperty(_NodeName); IF ISNULL(PropertyInfo) THEN EXIT(_Source.ToString()); Object := PropertyInfo.GetValue(_Source); IF NOT ISNULL(Object) THEN EXIT(Object.ToString()); EXIT(''); END; LOCAL PROCEDURE IsWebServiceMethod@7(_Method@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo") : Boolean; VAR SoapDocumentMethodAttribute@1001 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Protocols.SoapDocumentMethodAttribute"; SoapRpcMethodAttribute@1002 : DotNet "'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.Services.Protocols.SoapRpcMethodAttribute"; Attribute@1003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Attribute"; BEGIN EXIT( (NOT ISNULL(Attribute.GetCustomAttribute(_Method, GETDOTNETTYPE(SoapDocumentMethodAttribute)))) OR (NOT ISNULL(Attribute.GetCustomAttribute(_Method, GETDOTNETTYPE(SoapRpcMethodAttribute))))); END; BEGIN { You can use and modify this codeunit, at your own risk, with no waranty. You can leave a comment saying thank you on my blog: https://navnab.wordpress.com/ } END. } } OBJECT Codeunit 92601 SayHelloWebService { OBJECT-PROPERTIES { Date=04/12/16; Time=12:00:00; Modified=Yes; Version List=GWS; } PROPERTIES { OnRun=BEGIN END; } CODE { VAR HelloTxt@1000 : TextConst 'ENU=Hello %1 from %2.'; PROCEDURE SayHello@5() : Text; BEGIN EXIT(STRSUBSTNO(HelloTxt, USERID, COMPANYNAME)); END; BEGIN END. } } OBJECT Codeunit 92602 Test Generic SOAP Client { OBJECT-PROPERTIES { Date=04/12/16; Time=12:00:00; Modified=Yes; Version List=GWS; } PROPERTIES { OnRun=BEGIN Example1; // Example2; END; } CODE { VAR GenericSOAPClient@1013 : Codeunit 92600; Arguments@1001 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array" WITHEVENTS; ReturnObject@1005 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object" WITHEVENTS; LOCAL PROCEDURE Example1@4(); BEGIN WITH GenericSOAPClient DO BEGIN InitClient('http://Akuji:7047/DynamicsNAV90/WS/Cronus/Codeunit/SayHelloWS', 0, 'DOMAIN\USER', 'PASSWORD', 2); InitCallMethod('SayHello', Arguments); // Set arguments if needed CallMethod(Arguments, ReturnObject); MESSAGE('Example 1:\ %1', GetObjectValue('', ReturnObject)); END; END; LOCAL PROCEDURE Example2@5(); BEGIN WITH GenericSOAPClient DO BEGIN InitClient('http://Akuji:7047/DynamicsNAV90/WS/Cronus/Page/Customers', 0, '', '', 0); InitCallMethod('Read', Arguments); // Set arguments if needed Arguments.SetValue('10000', 0); CallMethod(Arguments, ReturnObject); MESSAGE('Example 2:\ %1', GetObjectValue('Name', ReturnObject)); END; END; BEGIN END. } }