Mostrando entradas con la etiqueta Servicio web. Mostrar todas las entradas
Mostrando entradas con la etiqueta Servicio web. Mostrar todas las entradas

jueves, 26 de noviembre de 2015

Consumir Web Service / Servicio Web SOAP II (RTC)


Hace un tiempo publicamos un post indicando como consumir un web service desde navision(Consumir Web service SOAP ), está funcionalidad se podía utilzar en el cliente clásico y hasta la version 2009. Ahora con el cambio de platafarma y hasta la version 2016 en la que se implementa una funcionalidad específica para realizar esto, la solución que hemos encontrado es la siguiente.

En resumen, lo que se hace es crear el fichero Xml directamente luego lo enviamos al web service y leemos la respuesta. En este caso enviamos dos parámetros y recogemos un valor booleano que nos devuelve una codeunit.


Variables.

Name                  DataType      Length
URL                    Text              250
Metodo               Text              1024
NameSpace         Text              80
NodeList             Automation    'Microsoft XML, v6.0'.IXMLDOMNodeList  
xmlhttp                Automation    'Microsoft XML, v6.0'.XMLHTTP  
xmldoc                Automation    'Microsoft XML, v6.0'.DOMDocument  
soapEnvelope      Automation    'Microsoft XML, v6.0'.IXMLDOMElement  
soapBody            Automation    'Microsoft XML, v6.0'.IXMLDOMElement  
soapMethod        Automation    'Microsoft XML, v6.0'.IXMLDOMElement  
soapAtributo        Automation    'Microsoft XML, v6.0'.IXMLDOMElement  
node                    Automation    'Microsoft XML, v6.0'.IXMLDOMNode  
parametersXmlDoc    Automation    'Microsoft XML, v6.0'.DOMDocument  
xmldoc2               Automation    'Microsoft XML, v6.0'.DOMDocument   


Función LlamarWS(Producto : Code[20];TipoMod : Code[20]) Result : Boolean

Result := FALSE;

//iniciar llamada al web service
URL:='http://localhost:7047/DynamicsNAV/ws/company/Codeunit/nombreCodeunit';
Metodo:='PruebasWS';
NameSpace:='urn:microsoft-dynamics-schemas/codeunit/nombreCodeunit';

// Crear el documento xml
CREATE(xmldoc,TRUE,TRUE);

// Crear el envelope SOAP
soapEnvelope := xmldoc.createElement('Soap:Envelope');
soapEnvelope.setAttribute('xmlns:Soap', 'http://schemas.xmlsoap.org/soap/envelope/');
xmldoc.appendChild(soapEnvelope);

// Crear el cuerpo del SOAP
soapBody := xmldoc.createElement('Soap:Body');
soapEnvelope.appendChild(soapBody);

// Crear el método del body
soapMethod := xmldoc.createElement(Metodo);
soapMethod.setAttribute('xmlns', NameSpace);
soapBody.appendChild(soapMethod);

// Crear los parametros del metodo.
soapAtributo:= xmldoc.createElement('oarametro1');
soapAtributo.text(textoParametro1);
soapMethod.appendChild(soapAtributo);

soapAtributo:= xmldoc.createElement('parametro2');
soapAtributo.text(textoParametro1);
soapMethod.appendChild(soapAtributo);

//Enviar fichero al web service
CREATE(xmlhttp, TRUE, TRUE);
xmlhttp.open('POST', URL, FALSE);
xmlhttp.setRequestHeader('Content-type', 'text/xml; charset=utf-8');
xmlhttp.setRequestHeader('SOAPAction', Metodo);
xmlhttp.send(xmldoc);

//si la respeusta es Ok devuelve valor 200
IF xmlhttp.status=200 THEN
BEGIN
  xmldoc := xmlhttp.responseXML;
  xmldoc.setProperty('SelectionLanguage','XPath');
  xmldoc.setProperty('SelectionNamespaces','xmlns:tns="'+NameSpace+'"');
  NodeList := xmldoc.selectNodes('//tns:'+'return_value');
  Result := TRUE;
  if NodeList.item(0).text = 'true' then
    Exit(TRUE);
End;
Exit(FALSE);


Tambien se podria realizar la lectura del Xml devuelto pero eso ya depende de los gustos de cada uno.

Variables
xmldoc2                Automation    'Microsoft XML, v6.0'.DOMDocument   

IF ISCLEAR(xmldoc2) THEN
  CREATE(xmldoc2,TRUE,TRUE);
xmldoc2.load(xmlhttp.responseXML);
xmldoc2.save('ruta\fichero.xml');

miércoles, 18 de mayo de 2011

Consumir Web Service / Servicio Web SOAP

Lo que vamos a hacer es realizar una conexión desde Navision a un servicio web de tipo soap.en princpio con este método se deberia de poder llamar a una función con parámetros pero a veces suele ocasionar problemas.

Creamos las siguientes variables de tipo automation.

locautSoapHttpConnector
Automation 'Microsoft Soap Type Library v3.0'.HttpConnector30

locautSoapSerializer
Automation 'Microsoft Soap Type Library v3.0'.SoapSerializer30

locautXmlDoc Automation 'Microsoft XML, v6.0'.DOMDocument



IF ISCLEAR(LocautSoapHttpConnector) THEN
CREATE(LocautSoapHttpConnector);

LocautSoapHttpConnector.Property('ProxyServer','isaserver');
LocautSoapHttpConnector.Property('ProxyPassword','proxypass');
LocautSoapHttpConnector.Property('ProxyUser','username');

LocautSoapHttpConnector.Property('EndPointURL','http://servername:7047/DynamicsNAV/ws/coduenit/');
LocautSoapHttpConnector.Connect;
LocautSoapHttpConnector.Property('SoapAction','http://servername:7047/DynamicsNAV/ws/coduenit/thefunction');
LocautSoapHttpConnector.BeginMessage;

CREATE(LocautSoapSerialize);
LocautSoapSerialize.Init(LocautSoapHttpConnector.InputStream);

LocautSoapSerialize.StartEnvelope('SOAP','STANDARD');
LocautSoapSerialize.StartBody;
LocautSoapSerialize.StartElement(Elemento o nodo);

 LocautSoapSerialize.StartElement('Elemento hijo');
 LocautSoapSerialize.WriteString('Parametro valido');
 LocautSoapSerialize.EndElement;

LocautSoapSerialize.EndElement;
LocautSoapSerialize.EndBody;
LocautSoapSerialize.EndEnvelope;

LocautSoapHttpConnector.EndMessage;

IF ISCLEAR(XMLDOM) THEN
CREATE(XMLDOM);
//Cargar la respuesta del servicio web esta es un fichero xml
XMLDOM.load(LocautSoapHttpConnector.OutputStream);
XMLNode := XMLDOM.selectSingleNode('//valid');

viernes, 15 de abril de 2011

Varios Servicios Web en un unico Servidor

Se deben de crear tantas instancias del servicio como bases de datos queremos atacar desde el web services. Para poder configurarlo de esta manera es necesario que la capa donde se encuentra instalado el servicio web y sus instancias sea la intermedia.
Creando un segundo servicio Lo primero que hay que hacer es parar los servicios instalados y hacer una copia de la carpeta Servicios que se encuentra dentro del directorio de instalación del web services de Navision: C:\Program Files (x86)\Microsoft Dynamics NAV\60\Services Y poner como nombre de la carpeta Server2 o lo que queramos. Para esto haremos lo siguiente:

  • Ir a “herramientas administrativas” y elegir servicios
  • Seleccionar “Microsoft Dynamics NAV Server” y darle STOP
  • Como ya hemos creado la copia de la carpeta services y la hemos llamado Services2 ahora hay que crear la instancia que hace referencia al servicio de la carpeta Services2.

Primero crearemos el Microsoft Dynamics Nav Server y luego el Microsoft Dynamics Nav Web Server ya que se necesitan un par de servicios por nueva base de datos un servicio web y un servicio Navision server. Para ello en la consola de comandos hay que poner lo siguiente:

sc \\ "servidor" create "nombre servicio" binpath= "ruta servicio" DisplayName= "nombre a mostar"start= "tipo arranque" type="own, shared"

En nuestro caso será de la siguiente manera:

sc \\Webservices03 create MicrosoftDynamicsNAVServer$NAV2 binpath= "C:\Program Files\Microsoft Dynamics NAV\60\Service2\Microsoft.Dynamics.Nav.Server.exe $NAV2" DisplayName= "Microsoft Dynamics NAV Server Instance 2" start= auto type= own

MicrosoftDynamicsNAV$NAV2 es para decir que va a ser una nueva instancia del mismo tipo de servicio y es necesaria en el nombre de servicio como al crear la nueva instancia. En el parámetro Type hay que poner Own

MicrosoftDynamicsNAVWS$NAV2 es una instancia del servicio para que cree el servicio web y así tener el par de servidores que necesitamos. La sintaxis para crear este servicio es la misma que para el anterior lo único es que  hay que poner en el nombre WS al final, justo antes del $, en el parámetro Type hay que poner Share

Una vez hecho esto hay que cerrar y abrir la ventana de los servicios para que aparezcan los nuevos servicios que hemos creado en este caso serian:

- Microsoft.Dynamics.Nav.Server.exe

- Microsoft.Dynamics.Nav.web.Server.exe

Configurando los servicios creados
Una vez abierta la ventana con el listado de los servicios, vamos uno de los servicios y en las propiedades en la pestaña LogOn escoger la opción this account, poner webservices@atspain, sus contraseñas y guardar. No hay que arrancar porque daría error ya que los dos MicrosoftDynamicsNavServer están tirando del mismo puerto 7046 y hay que cambiarlo junto con la instancia del servicio en el fichero CustomconfigSetting.config de la carpeta Service2. Para el servicio MicrosoftDynamicsNavWebServer no es necesario cambiar el puerto y siempre tiraremos del 7047. En el fichero CustomconfigSetting.config cambiaremos las siguientes opciones:

Add key="DatabaseServer" value="Servidor de la nueva base de datos"

Add key="DatabaseName" value="Nombre de la nueva base de datos"

Add key =”ServerInstance” value =”DynamicsNav2”

Add key="ServerPort" value="7049"

Add key="WebServicePort" value="7047"






En este caso la url sería:

http://webservices03.dominio:7047/DynamicsNAV2/ws/Services

Problemas comunes.

Error: The Microsoft Dynamics NAV Business Web Services service on Local Computer started and then stopped. Solucion: suele ocurrir cuando intentamos arrancar dos servicios que tiran contra el mismo Puerto en este caso y por configuración estándar el 7046, cambiar puerto y listo.
Error: Cuando en el explorador nos aparece lo siguiente Solución: Es un problema de acceso a la base de datos, el servicio funciona bien pero no tiene permisos de entrada a la base de datos, hay que comprobar que en la base de datos del usuario esté creado el usuario que utilizamos para conectarnos en este caso webservices y que la licencia tenga activado el granulo 91000

jueves, 14 de abril de 2011

Creación de servicios web en tres capas diferentes


El escenario que vamos a crear y configurar consta de tres capas diferenciadas en tres máquinas diferentes.


1 Escenario


  • WEBSERVICES03.ATSPAIN; Windows Server 2008 R2 Standard, están instalados los servicios web.

  • SERVSQL; Windows Server 2008 R2 Standard, es donde está instalada la base de datos

  • Clientes de Navision.

2 Creación y configuración de los servicios Web Crear una cuenta de usuario de dominio tanto para lanzar los servicios y que tenga privilegios de administrador, en este caso usuario “webservices”. No hay problema si el usuario que arranca los servicios web y los servicios de Sql son diferentes, lo importante son los privilegios de administrador. Después de crear la cuenta de usuario de dominio se debería de verificar si el nivel funcional de dominio es de al menos Windows Server 2003. Para ello en el servidor SERVSQL hacer “Ejecutar” y escribir dsa.msc, hacer clic con el botón derecho sobre el dominio donde esté instalado el cliente Navision y elegir la opción “Raise Domain Functional Level”. Instalar los servicios web de Navision en un equipo destinado para ello, en este caso lo instalaremos en el servidor “webservices03”. Para esto arrancar el DVD de Navision y en la opción de instalar componentes seleccionar Server, darle aplicar y dejar instalar.


  • 2.a configuración Servicios web Para configurar los servicios web es necesario ir a los servicios (herramientas admin.-->Servicios).Los dos servicios web de Navision son: - Microsoft Dynamics Nav Business Web Services - Microsoft Dynamics Nav Server En las propiedades de cada uno de estos dos servicios es necesario cambiar el usuario de logueo (pestaña LogOn opción this account)por el usuario que hemos creado anteriormente (webservices).

  • 2.b Fichero configuración de servicios web Los parámetros del servicio Web se configuran en el fichero “CustomSettings” dentro de la carpeta C:\Program Files (x86)\Microsoft Dynamics NAV\60\Service del servidor donde están los web services instalados (Webservices03). Los parámetros más importante a modificar son : - (se indica el servidor de base de datos) - (nombre de la base de datos sobre la que consumen los web service) - (nombre de la instancia del Navision Nav Server, es decir para identificar ese servicio en concreto, por defecto es DynamicsNAV no hace falta cambiarla pero se puede cambiar por ejemplo si hay más servicios instalados y así poder identificarlos) Una vez modificados estos parámetros se arrancan los servicios web. Se recomienda arrancar primero “Microsoft Dynamics Nav Server” y luego “Microsoft Dynamics Nav Business Web Service”.
3 Activar el Object Change Listener (OCL) Monitoriza los cambios de objectos que se producen en la base de datos (Pej. creación de campos en las Pages ), sin esto activado no se pueden conectar los clientes con el servidor. Para poder inicializarlo el servidor de Navision debe tener permisos para la base de datos de Sql. Activar y asignar permisos minimos para el OCL: - Abrir el SQL management studio y luego file --> new-->Query with current connection y escribir las siguientes consultas. Por cada una hay que ejecutar.

  • USE MASTER CREATE LOGIN [ReplaceWithNAVServerAccount] FROM WINDOWS; GO USE [ReplaceWithYourDatabaseName]

  • CREATE USER [ReplaceWithNAVServerAccount] FOR LOGIN [ReplaceWithNAVServerAccount];

  • CREATE SCHEMA [$ndo$navlistener] AUTHORIZATION [ReplaceWithNAVServerAccount];

  • GO ALTER USER [ReplaceWithNAVServerAccount] WITH DEFAULT_SCHEMA = [$ndo$navlistener];

  • GRANT SELECT ON [Object Tracking] TO [ReplaceWithNAVServerAccount];


4 Dar permisos de cuenta de usuario de dominio al directorio del servidor Es necesario darle al directorio del servidor del de “Microsoft dynamics nav server” del equipo donde están los servicios instalados (webservices03) todos los permisos del usuario de cuenta de dominio. - Ir a la carpeta : ProgramData\Microsoft\Microsoft Dynamics NAV\60\ - Propiedades y pestaña “Seguridad” - Seleccionar el usuario de cuenta de dominio y en los permisos poner Allow junto al permiso”Control Total”. - Seleccionar la cuenta “NETWORK SERVICE” y hacer como el usuario Allow junto al permiso de “Control Total” 5 Configuración de la delegación de usuarios Creando los SPN (Service Principal Names ): Hay que crear cuatro spn para el usuario webservices la sintaxis es la siguiente:


  • Setspn –a HTTP/WEBSERVICES03 webservices

  • Setspn –a HTTP/WEBSERVICES03.dominio webservices

  • Setspn –a DynamicsNAV/webservices03:7046 webservices

  • Setspn –a DynamicsNAV/webservices03.dominio:7046 webservices

Para comprobar que se han creado bien hay que ver el listado:

  • Setspn –l webservices

  • HTTP/WEBSERVICES03

  • HTTP/WEBSERVICES03.dominio

  • DynamicsNAV/webservices03:7046

  • DynamicsNAV/webservices03.ATSPAIN:7046
Delegación de acceso a los servicios Sql En el servidor de sql se realiza la delegación de usuarios: - En ejecutar escribir dsa.msc - Elegir buscar en el dominio donde está creado el usuario - Poner webservices y seleccionar resultado de la búsqueda - En la pestaña Delegation poner la opción 2 : o Trust this user for delegation to any service (Kerberos Only). - Aceptar. Comprobar si se puede hacer ping al servidor donde se encuentran los webservices desde el servidor de sql.