Buenos días,
Tengo problemas al tratar de consumir un web service creado en AX desde una aplicación cliente en Visual Studio.
Básicamente, primero, investigué como crear web services para luego consumirlos ya sea desde una aplicación externa o Dynamics AX 2012.
Encontré esta liga, la cual me ayudó mucho paso-a-paso:
https://sumitsaxfactor.wordpress.com/2012/05/19/create-your-first-custom-service-ax-2012/
Hice y seguí los ejemplos explicados en la liga de arriba para crear y levantar un servicio en AX y, luego, consumirlo desde una aplicación de Windows Forms creada en Visual Studio 2013.
Hasta este punto no tengo problemas
Se logra establecer la comunicación y se puede consumir el servicio.
El asunto es que todos los ejemplos que hice los pasé a otro servidor.
El segundo servidor tiene instalado el AX 2012, Visual Studio 2013, Visual Tools, BI y IIS.
Importe los mismos objetos al AX del segundo servidor.
Luego, en Visual Studio del segundo servidor creé una interface de Windows Forms con el mismo código de la primera no olvidando asignar la referencia del servicio.
Corro la aplicación de Windows Forms y no ocurren errores, pero no me consume el web service y, por lo tanto, no trae datos.
Así que se hicieron otros intentos en el segundo servidor:
1. Se instalaron los componentes de servicios web en IIS.
2. Se revisó que los puertos en el AIF de AX estuvieran activados.
3. Se desactivó el firewall
4. Se revisó que el usuario tuviera permisos como administrator
5. Se hizo sesión al servidor dos como administrador.
Y, absolutamente, nada. En el segundo servidor sigue sin consumirse el web service.
Alguien pudiera ayudarme.
Les paso el código de la aplicación cliente en Visual Studio que quiere consumir el webservice:
El web service lo consumo oprimiendo un botón en mi interface, al cual le asigné el siguiente código:
private void button3_Click(object sender, EventArgs e)
{
string[] strItem = null;
int i = 0;
XmlDocument xDoc = new XmlDocument();
//La ruta del documento XML permite rutas relativas
//respecto del ejecutable!
xDoc.Load("C:\\Users\\MiUsuario\\MiCarpeta\\Factura.xml");
CustomerRef.CallContext callContext = new CustomerRef.CallContext();
CustomerRef.SamCustomServiceClient servClient = new CustomerRef.SamCustomServiceClient();
strItem = new string[listBox1.SelectedItems.Count];
//Get selected customer ids and prepare a string array
foreach (Object selecteditem in listBox1.SelectedItems)
{
string item = selecteditem as string;
strItem[i++] = item;
}
//Use the Data Contract array to get the customer information
CustomerRef.SamCustomServiceContract[] custInfo = servClient.retrieveCustomerInfo(callContext, strItem, xDoc.InnerXml);
listView1.Items.Clear();
i = 0;
foreach (CustomerRef.SamCustomServiceContract custDet in custInfo)
{
ListViewItem item = listView1.Items.Add(strItem[i++]);
item.SubItems.Add(custDet.CustName);
item.SubItems.Add(custDet.CustGroupId);
item.SubItems.Add(custDet.DefaultLanguage);
item.SubItems.Add(custDet.XML);
}
}
Este es el código del método del webservice en AX que trató de consumir:
[SysEntryPointAttribute(true),
AifCollectionTypeAttribute("return", Types::Class, classStr(SamCustomServiceContract)),
AifCollectionTypeAttribute("_custList", Types::String)]
public List retrieveCustomerInfo(List _custList, str _xml)
{
SamCustomServiceContract dataContract;
ListEnumerator listEnum = _custList.getEnumerator();
List resultSet = new List(Types::Class);
CustTable custTable;
while (listEnum.moveNext())
{
select firstOnly custTable
where custTable.AccountNum == listEnum.current();
dataContract = new SamCustomServiceContract();
if (custTable)
{
dataContract.parmCustGroupId(custTable.CustGroup);
dataContract.parmCustName(custTable.name());
dataContract.parmDefaultLanguage(custTable.languageId());
dataContract.parmXML(_xml);
}
resultSet.addEnd(dataContract);
}
return resultSet;
}