Agregar Referencia a WebService en Visual Studio 2010
Consumir un WebService desde VisualStudio es muy fácil, ya que este contiene herramientas visuales para generar las clases y archivos necesarios, solo nos queda hacer unas pequeñas configuraciones para poder hacer llamadas a los servidores de de testing y el de producción desde cualquier lenguaje .NET que soporte visualStudio (C# .NET, VB .NET, etc).
Paso 1
Seleccionar el proyecto para añadir el ServiceReference.
Paso 2
Ingresar la URL y especificar el namespace para identificar los objetos.
Paso 3
Cuando se agrega la referencia se generan datos sobre el Endpoint en un archivo llamado: app.config que esta ubicado en la carpeta del proyecto en donde fué agregada la referencia, en este caso esta en: .../Visual Studio 2010/Projects/ConnectToWebService/ConnectToWebService/app.config
Este archivo debe ser modificado con el fin de podernos conectar al WebService de producción y testing solo cambiando el nombre de "Endpoint" que vamos a usar.
Abriremos el archivo app.config e identificaremos la seccion de el
extracto de código que a continuación se muestra y añadiremos el
texto que aparece marcado:
Nota: el namespace "com.sf.ws.Timbrado." debe ser
reemplazado por el nombre que usted le dió a la hora de agregar el "ServiceReference"
en el paso 2
Se han omitido algunas partes del archivo.
Descarga el archivo completo app.config
Paso 4
Una vez hecha la configuración en el archivo app.config, podemos consumir el WebService para testing y produccion, a continuación se muestra un extracto de código:
Ejemplo de código en C# .NET - WebService de Timbrado
bool produccion = false; string prod_endpoint = "TimbradoEndpoint_PRODUCCION"; string test_endpoint = "TimbradoEndpoint_TESTING"; //Si recibe error 417 deberá descomentar la linea a continuación //System.Net.ServicePointManager.Expect100Continue = false; //El paquete o namespace en el que se encuentran las clases //será el que se define al agregar la referencia al WebService, //en este ejemplo es: com.sf.ws.Timbrado com.sf.ws.Timbrado.TimbradoPortTypeClient portClient = null; portClient = (produccion) ? new com.sf.ws.Timbrado.TimbradoPortTypeClient(prod_endpoint) : portClient = new com.sf.ws.Timbrado.TimbradoPortTypeClient(test_endpoint); try { byte[] bytes = Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(@"C:\Users\Solucion\Downloads\Facturas2\Factura2.xml")); System.Console.WriteLine("Sending request..."); System.Console.WriteLine("EndPoint = " + portClient.Endpoint.Address); com.sf.ws.Timbrado.CFDICertificacion response = portClient.timbrar("testing@solucionfactible.com", "timbrado.SF.16672", bytes, false); System.Console.WriteLine("Información de la transacción"); System.Console.WriteLine(response.status); System.Console.WriteLine(response.mensaje); System.Console.WriteLine("Resultados recibidos" + response.resultados.Length); com.sf.ws.Timbrado.CFDIResultadoCertificacion[] resultados = response.resultados; //Clases a usar en cancelación: //com.sf.ws.Timbrado.CFDICancelacion //com.sf.ws.Timbrado.CFDIResultadoCancelacion } catch (Exception ex) { System.Console.WriteLine(ex.StackTrace); }
Ejemplo de código en VB .NET - WebService de CFDI
'Declarar el tamaño del arreglo con la cantidad de CFDIs que se van a enviar Dim cfdi(0) As com.solucionfactible.testing.cfdi.CFDI cfdi(0) = New com.solucionfactible.testing.cfdi.CFDI 'Declarar el arreglo con la cantidad de conceptos que se van a agregar al CFDI Dim detalleCFDI(1) As com.solucionfactible.testing.cfdi.DetalleCFDI detalleCFDI(0) = New com.solucionfactible.testing.cfdi.DetalleCFDI 'Construir con la información del concepto detalleCFDI(0).importe = 100.0 detalleCFDI(0).concepto = "Concepto 1" 'Para algunos campos es necesario especificar que éste lleva un valor detalleCfdi(0).precioUnitario = 100 detalleCfdi(0).precioUnitarioSpecified = True detalleCfdi(0).cantidad = 10 detalleCfdi(0).cantidadSpecified = True '... detalleCFDI(1) = New com.solucionfactible.testing.cfdi.DetalleCFDI detalleCFDI(1).importe = 150.0 detalleCFDI(1).concepto = "Concepto 2" '... 'Agregar al cfdi cfdi(0).detalleCFDI = detalleCFDI
Las lineas resaltadas en el código anterior hacen referencia al atributo: name="TimbradoHttpsSoap11Endpoint de cada endpoint configurado en el archivo app.config.
Solución de problemas
Mensaje de error: "unrecognized attribute decompressionenabled"
El atributo "decompressionenabled" solo es reconocido si el proyecto esta configurado para usar NetFramework4, de otra forma, solo tienes que abrir el archivo app.config y remover este atributo que deberia estar dentro de un tag: <httpsTransport/>