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 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 poder 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 sección 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 producción, 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); }
Las líneas 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/>
Mensaje de error:
"No se encontró el elemento de extremo con el nombre
'TimbradoEndpoint_TESTING' y el contrato 'SolucionFactible.TimbradoPortType'
en la sección de configuración de cliente de ServiceModel ..."
También se puede mostrar como:
"Could not find endpoint element with name 'TimbradoEndpoint_TESTING' and contract
'SolucionFactible.TimbradoPortType' in the ServiceModel client configuration section ..."
En una Solución de Visual Studio con varios proyectos, se debe asegurar de que
la configuración de los endpoints exista en el App.config
del proyecto que esté designado como el proyecto principal ya que este
es el que se carga cuando se inicia la aplicación.
Mensaje de error:
"Se ha excedido la cuota de tamaño máximo de los mensajes entrantes (65536)."
Para aumentar la cuota, use la propiedad MaxReceivedMessageSize en el elemento de enlace
correspondiente, o bien, agregar un nuevo nodo webHttpBinding que aplique para todos los bindings
<webHttpBinding>
<binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
</webHttpBinding>