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/>