sábado, 6 de octubre de 2012

[ASP.NET] Crear y Publicar - Web Service (1/3)

 

Introducción


Un problema que se presenta regularmente luego de terminado el desarrollo de un proyecto web esta relacionado con la publicación y puesta en marca en un ambiente productivo, la idea del articulo será la de marcar los pasos para la creación y puesta en producción de un servicio web, así como también una página aspx, como veremos tratar un servicio o una pagina requieren los mismo pasos.

Se podría considerarse un servicio web (asmx) como una paginas aspx solo que sin una interfaz visual que se desplegué al usuario, los servicio permitirán que otras aplicaciones recuperen información publicada por medio de un protocolo conocido como es el http

En esta primera parte se analizaran:

  • Crea un proyecto asp.net
  • Agregar un web service al desarrollo web
  • Consumir web service
  • Actualizar configuración servicio

El ejemplo en el cual se basara la demostración consiste solo una lista de cursos que se obtiene de una base de datos. Como la publicación de un servicio es idéntica a la de una pagina web aprovecharemos el articulo para contemplar ambos escenarios.

 

Crear proyecto web


El primer paso será la creación del proyecto web

clip_image002

Es importante usar la opción que sea un Web Application

SNAGHTML11bb456

La estructura del proyecto del ejemplo incluye una db en carpeta de datos

clip_image004

Al ejecutar la pagina que lista los cursos se visualizara en el browser el resultado

clip_image006

Como es un ejemplo simple solo se hizo uso de un gridview junto a la ayuda de Entity Framework para resolver el acceso a datos

Por supuesto hasta ahora se hace uso del Visual Studio Developer Server, el cual es muy útil cuando se esta desarrollando, pero solo en esta etapa luego debe publicarse en el IIS

SNAGHTML3c4c21a

image

El Visual Studio creara por nosotros un server virtual en el puerto indicado en la configuración

 

Crear Servicio web


El próximo paso involucra la creación del servicio web, para ello agregaremos un nuevo ítem al proyecto web creado en el paso anterior

clip_image008

 

image

En el servicio se define un webmethod que liste los cursos

 

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SchoolService : System.Web.Services.WebService
{

    [WebMethod]
    public List<CurseDTO> GetCurseList()
    {
        using (SchoolEntities context = new SchoolEntities())
        {
            return (from curse in context.Course
                   select new CurseDTO()
                   {
                       CurseId = curse.CourseID,
                       Title = curse.Title,
                       Department = curse.Department.Name
                   }).ToList();
        }
    }
}

public class CurseDTO
{
    public int CurseId {get; set;}
    public string Title { get; set; }
    public string Department {get; set;}
}

Si queremos ver la pantalla de inicio del servicio para validar que este correcto, solo será cuestión de navegarlo en el browser

clip_image012

image

Y hasta se puede invocar desde allí mismo

image

 

Consumir servicio web


Para consumir un servicio desde una aplicación cliente se agrega una referencia que creara el proxy, el cual no es mas que código para facilitar la invocación al servicio

SNAGHTML110147f

En este caso como el servicio esta en la misma solución se descubre de forma directa, sino será necesario definir la url donde se publico el servicio

SNAGHTML111cec8

Si bien a simple vista pareciera que la referencia al servicio no hizo mucho

SNAGHTML3cdc8ed

Si se habilita la opción superior de la barra del solution explorer se podrá descubrir mucho

SNAGHTML3cf8fa5

La referencia al servicio crea código por nosotros, además de definir una sección en el app.config, en el cual se podrá cambiar la url sin necesidad de recompilar luego de hacer la implementación definitiva del servicio en el IIS

image

Consumir el servicio desde código solo implica crear la instancia del proxy para luego hacer uso del método definido

using School.UI.SchoolSvc;
.
.

CurseDTO[] curseList;
using (SchoolServiceSoapClient svc = new SchoolServiceSoapClient())
{
    curseList = svc.GetCurseList();
}

dgvCourse.DataSource = curseList;

Con esto alcanza para invocar al servicio que hostea el server virtual que crea el VS y cargar el grid con la misma lista que al principio mostramos en la pagina web

Algo que seguramente habrán notado en el código seguro se relaciona con la respuesta del web method, como puede ser que devuelve un array de entidades cuando el código del servicio deja bien claro que era una lista, bien eso se debe a como se configura la referencia, pero puede cambiarse si hace falta.

SNAGHTML3ecbfca

Y se define el tipo de dato para que sea una lista

SNAGHTML3efc7b6

Al recompilar el proyecto el código que genera la referencia al servicio también devuelve una lista.

Código


El ejemplo del código fue creado con Visual Studio 2008 y Sql Server Express 2008 R2

[C#]
 

92 comentarios:

  1. Buenas noches Leandro, te vengo molestando de nueva cuenta, sigo realizando un proyecto, y me a surgido una gran duda, no se si me puedas ayudar, estoy trabajando con vs2010 C#, y manejo archivos en mi bd, quiero saber si sabes alguna manera como insertar archivos a mi bd de forma automatica, por ejemplo, tengo una carpeta en windows seria mi servidor ftp, donde se almacenan archivos (imagenes).jpg enviados por camaras ip cada 10 min, cada imagen tiene un nombre unico de 12 caracteres numeros y letras + la extencion, y podria hacer un programa que revise cada 5 min si existen imagenes en la carpeta y a su vez tomarlas y depositarlas en la bd, esto se haria mediante tareas programas de windows que se ejecute cada cierto tiempo el programita, yo lo e visto pero con mysql, utilizando un archivo .bat que ejecuta instrucciones bajo simbolo de sistema, pero no se exactamente que contenga el codigo, y no se si se pueda hacer algo muy parecido con asp. net y sql server,que vaya y revise la carpeta, busque ciertos archivos a una carpeta ftp o X de windows, los tome y los deposite automaticamente a mi bd cada cierto tiempo,espero me haya dado a entender, saludos!!!!

    ResponderEliminar
  2. Hola leandro hay alguna forma de contactart por skype o wlm

    quiero conversar con ud. para pedirle unos consejos sobre una aplicacion winform y autenticacion de usuarios directo a la base de datos desde esta aplicacion winform en c#

    ResponderEliminar
  3. hola raul

    la verdad no soy de usar aplicaciones de chat

    si quieres puedes enviarme un mail con el planteo del problema

    saludos

    ResponderEliminar
  4. hola leandro deantemano gracias x tus siempres ayudas, mi problema es q tengo una aplicacion en vb 6.0 y necesito consumir un web service y no se como hacer la conexion, gracias...

    ResponderEliminar
  5. hola

    vas a tener que armar todo el mensaje SOAP para poder invocar el servicio

    Usar un servicio Web XML desde VB6

    saludos

    ResponderEliminar
  6. Buenas Leandro, antes que nada te doy las gracias por el Blog ya que estoy aprendiendo mucho de acá y lo uso como referencia para muchas dudas que me van surgiendo.

    Por otro lado, y yendo al punto de mi comentario, por las dudas me podrías guiar en como hacer para configurar el IIS y hacer que sea accesible desde Internet, según lei, lei, lei y lei de que hay que abrir puertos y otras cosas que me pierden y no lo estoy haciendo para nada bien por lo visto.

    Para que lo quiero?

    Quiero publicar un WebService que este corriendo en mi maquina y que me permita enviar SMS con un celular GSM que esta conectado a mi maquina (seria mi servidor no?) y, luego consumir este WebService desde el hosting donde esta corriendo mi aplicación. Con respecto al código enviar SMS y demás, ya se como hacerlo.

    Esto que quiero hacer es para el desarrollo del trabajo final de mi Carrera, lo cual quisiera un poco de ayuda para llevarlo a cabo.

    Muchísimas gracias por tu tiempo Leandro y espero haberme expresado correctamente para que entiendas mi idea. Cualquier corrección o sugerencia de como hacer mejor esto sera bien recibida.
    Saludos

    ResponderEliminar
  7. hola nicolas

    el exponer un sitio a internat no tiene mas misterio que abrir los puerto en el firewall que estes usando

    analiza lo que comento aqui

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/f109e108-6f84-4ed8-abfb-a143ee1173cb/

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/c8b4d057-4a39-4bcc-84e9-033dd9fc3bf2/

    en esas preguntas planteo este mismo tema, veras que depende del router quizas cambie un poco, pero seria mapear un puerto de wan con un puerto y ip de la lan

    saludos

    ResponderEliminar
  8. Perodn no envio el fragmento del web config. Como estas Leandro, por favor tengo un problema con subir a la base de datos un archivo mayor a 1mb por medio de un web services, ya incremente:

    binding name="CorrespondenciaEndPoint" closeTimeout="00:40:00"
    openTimeout="00:40:00" receiveTimeout="00:40:00" sendTimeout="00:40:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferSize="10485760" maxBufferPoolSize="10485760" maxReceivedMessageSize="10485760"
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    useDefaultWebProxy="true"
    readerQuotas maxStringContentLength="10485760" maxArrayLength="10485760"
    security mode="None"
    transport clientCredentialType="None" proxyCredentialType="None"
    realm=""
    message clientCredentialType="UserName" algorithmSuite="Default"
    security
    binding


    Este fragmento ets aconfigurado tanto en el cliente como en el web services, pero no sube el archivo se cierra la conexion con el web services por fa ayudame....
    Atte, Ruben

    ResponderEliminar
  9. hola Ruben

    de que tipo de servicio se trata, es un asmx o un servicio de wcf ?

    si es un asmx podrias probar usando

    http://danmyhre.wordpress.com/2012/05/15/50mb-limit-on-files-sent-to-content-organizerofficialfile-asmx/

    comov eras se cambia el maxRequestLength del <system.web>

    saludos

    ResponderEliminar
  10. Leandro, muchas veces aprendo de tus consejos, sin embargo, me encuentro frente a algo nuevo. Yo he fabricado Web Services y también sé cómo consumirlas, pero ahora me solicitan "enviar datos a un WS". Se trata de datos GPS que debo hacer llegar a http://165.182.186.166:8080/process/gps/online?wsdl.
    Ellos (los receptores de esta información) me establecieron la arquitectura y los nombres de los tags XML tanto para el documento de "entrada" como el de "salida".
    Yo tengo los datos y no tendría problemas en seleccionarlos y recorrerlos pero no sé cómo enviarlos.
    Te agradeceré si me puedes dar una ayuda con esto.
    Gracias de antemano.

    ResponderEliminar
  11. hola Carlos

    sabes en que lenguaje fue programado ese servicio ? apostaria a que esta en java

    pudiste crear la clase proxy a ese servicio? a veces suando la opcion de Add Reference el VS no funciona
    pero puede hacerlo por linea de comando

    Herramienta Lenguaje de descripción de servicios Web (Wsdl.exe)

    si logras crear el proxy el resto solo es instanciar el servicio he invocar los metodos

    saludos

    ResponderEliminar
  12. Hola Leandro. De antemanoo gracias por leerme.
    La situación es la siguiente.
    Estoy trabajando con joomla y le introduje una aplicacion .Net.

    Lo que requiero es obtener la variable de sesion.

    Lo que ya hice fue usar nosoap desde php y con eso llame un webservice de .net, con eso pude registrar una variable de sesion en el. El problema que tengo es que uso es mismo webservice en mi aplicación, pero
    no puedo leer la varible que registre anteriormente desde php con nosoap.
    ¿Sabes como podría hacerlo?

    ResponderEliminar
  13. hola Daniel

    el tema es que de por si entre distintas aplciaciones no puedes compartir Session

    deberias pasar ese dato por querystring (o sea en la url),
    o sino hacer uso de algun medio compartido como ser una base de datos, la aplicacion asp escribe en la db y la php toma el valor de alli

    saludos

    ResponderEliminar
  14. Hola Leandro,
    Se ve bien completo en código gracias por compartirlo.
    mi objetivo es implementarlo en en un servidor web para que desde ahí pueda consumirlo desde un dispositivo movil.

    con el dispositivo voy a tomar fotos y un poco de texto y cuando tenga conexión a Internet subir la información al servidor.
    espero me vaya bien :).

    Cualquier duda te estaré preguntando para que me orientes :)
    buenas noches

    ResponderEliminar
  15. Buenas tardes Leandro. Buscando una ayuda con el tema de web service he llegado hasta aquí, y veo que mucho estan muy agradecido con el apoyo que le impartes.
    De ante mano muchas gracias por aportar con tus conocimiento a los que estamos inciandonos en este mundo.
    Tengo un web services para consumir que es este: http://clocator.comsatel.com.pe:8080/wsSisLoc/WSServicioUltimaLocalizacion?wsdl, al momento de agregar la referencia a mi proyecto todo va bien, puedo acceder a los metodos y clases generadas por el la web service pero, a demas de ello tengo un usuario y password que son la credenciales de seguridad y son los mismo que no se como pasarle.
    Estas son caracteristicas del web service
    Protocolo: HTTP
    Estándar: SOAP
    Seguridad: WS-Security
    Password: formato Digest

    Porfavor si puedes darme alguna ayuda.

    ResponderEliminar
  16. hola William

    CÓMO: Pasar credenciales actuales a un servicio Web de ASP.NET

    en la instancia de la clase del proxy deberias poner asignar

    svcproxy.Credentials = new NetworkCredential("userName", "password");

    saludos

    ResponderEliminar
  17. Estimado Leandro, el servicio web esta desarrollado en Java y estoy intentado consumirlo desde vb.net en entonrno escritorio. Gracias por tu apoyo

    ResponderEliminar
  18. Estimado intente pasarle las credenciales tan como lo indica en su respuesta, y me sigue dando el mismo error (An error was discovered processing the header).
    Lo que no se, es donde indico el tipo de password PasswordDigest que me especifica el priveedor del web service. Gracias por tu apoyo y disculpa la molestia.

    ResponderEliminar
  19. hola William

    la verdad sobre este tema que comentas no tengo experincia ya que nunca me toco implementar este tipo de seguridad

    pero viendo de que se trata parece ser que se relaciona con el WS-Security

    WS-Security Authentication and Digital Signatures with Web Services Enhancements

    aunque lo veo algo un poco complejo

    saludos

    ResponderEliminar
  20. Hola Leandro, sienpre revisando tus publicaciones.

    tengo un problema con mi Web Services desarrollado en ASP de Vb.net. hasta ahora todo trabaja OK, mi problema radica en como pongo seguridad al web services ya que al momento de publicarlo cualquier persona puede colocar los parametros y ver el contenido del XML.

    me podrias dar algun alcance.

    Atte.
    Moises Vilchez Tello

    ResponderEliminar
  21. hola

    hay varias formas de lograrlo

    HTTP Security and ASP.NET Web Services

    Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

    podrias ver de asignar credenciales usando la integracion con windows, o sino usando certificados

    Securing XML Web Services Created Using ASP.NET

    tambien podrias suar el soap header para enviar usuario y password

    How to: Perform Custom Authentication Using SOAP Headers.

    saludos

    ResponderEliminar
  22. Hola Leandro.. yo tengo una gran confusión con las tecnologías que asp.net tiene para realizar servicios web.. Yo actualmente necesito desarrollar servicios web rest.. para consumir desde una aplicación movil..
    (es decir wcf, mvc 3, web api)
    Agradecería me pudiera aconsejar.. o aclararme el panorama en cuanto a las tecnologias para realizar un servicio rest?

    ResponderEliminar
  23. hola Carlos

    si es verdad hay una variedad de alternativas

    pero recuerda que web api es mvc ya sea 3 o 4, este se basa en la estructura de controladores y actions para modelar la funcionalidad

    si quieres algo simple web api es un buen camino

    http://www.asp.net/web-api

    saludos

    ResponderEliminar
  24. Hola Leandro.

    Tengo una consulta, en un servidor 2008 R2 que tiene instalado IIS, se van a instalar dos webservices distintos, la consulta es la siguiente, que me recomiendas en cuanto a tener ambos webservices (que apuntan a BD distintas) en el mismo "Default Web Site" o crear un Web Site para cada uno ? De hecho a cada WS se le creó un Application Pool distinto.

    Esto por el asunto si se va a detener alguno de los dos que no afecten al otro.

    Saludos.

    Mauricio Arguedas.

    ResponderEliminar
  25. hola Prueba

    si vas a ubicar los servicio en el mismo sitio el app pool sera el mismo, no puede usar dos app pool

    el app pool aplica por sitio web en el iis

    poner los servicio en el mismo sitio en el iis o en diferentes es indistinto puede implementarlo de ambas formas, todo depende si quieres crear un sola url o dos distintas

    lo que si analiza como vas a definir los connection string en el web.config, porque vas a necesitar keys distintas una para cada aplicacion, recuerda que al poner los servicio en el mismo sitio el web.config se tiene que unificar

    saludos

    ResponderEliminar
  26. Hola Leandro, sorry por molestar pero la verdad es que tengo un problema el cual no se como resolver, al igual que otro compañero tengo un webservice en net sin seguridad y necesito asegurarlo para ello quiero utilizar un certificado de prueba, dicho certificado ya lo cree con makecert pero no logro dar con algun ejemplo que me muestre como enviar el certificado desde el cliente y validarlo en el webservice.

    Yo creo que no doy con la respuesta porque estoy enredado con todo lo que he leído de WS y WCF o bien entendi mal el concepto.

    Ahh casi lo olvido, mi cliente es un Winforms y el WS debe ser consumido desde internet/intranet.

    Espero puedas ayudarme.

    Saludos Cordiales.

    ResponderEliminar
  27. hola MatiCris

    el tema es que el ceritficado no se utiliza para implementar autenticacion, el certificado podrias usarlo para implementar SSL (https), o sea un canal de comunicacion seguro entre quien realiza la invocacion y el servicio para que no se pueda interceptar y cambiar el contenido del mensaje

    pero el certificado no autentica quien ingresa o no

    el certificado podrias usarlo en el IIS

    Configuring IIS 7 with Self-Signed Server and Client Certificate

    despues solo se accede por https:// al servicio

    saludos

    ResponderEliminar
  28. Buenas noches

    He seguido el tutorial y la verdad es que me funciona perfectamente en loca. Pero cuando lo intento publicar en un servidor externo (host contratado) no funciona

    ¿se necesita configurar algo mas para publicarlo en un servidor externo?

    Saludos y Muchas gracias

    ResponderEliminar
  29. hola Javier

    cuando dices que no funciona que seria exactamente, recibes algun error en concreto?

    validaste con el soporte del hosting?

    saludos

    ResponderEliminar
  30. Hola. Una consulta
    En un web Service desde el cliente como paso parametros tipo list al servicio y en el servicio como paso parametros tipo list a una clase

    ResponderEliminar
  31. hola BanBan

    cuando creas el proxy usa la opcion

    imagen

    como veras puedes cambiar el tipo de dato de array a List<>
    de esta forma puedes definir en el webmethod un tipo de dato List<> con una clase que definas

    saludos

    ResponderEliminar
  32. SAludos Leandro,

    Una pregunta, publicar un web service en internet para que sea accedido fuera de una intranet es muy complicado?
    Que consideraciones técnicas hay que contemplar?
    Gracias

    ResponderEliminar
  33. hola Luis

    depende, si vas a contratar un hosting donde publicar el servicio es simple
    ahora si quieres crear tu propio hosting eso es mas complicado porque deberas abrir puertos y crear servicio de DNS, o sea llva algunas tareas adicionales de configuracion de la infraestructura que un hosting contratado ya tiene resuelto

    saludos

    ResponderEliminar
    Respuestas
    1. Hola Leandro antes que nada recibe un saludo y un agradecimiento por tu tiempo, entonces si quisiera publicar mi WCF con la IP fija (previamente configurada y su respectivo puerto en IIS), tnego que configurar el DNS?,, lo pregunto porque de hecho ese problema lo tengo actualmente mi WCF funciona perfectamente (en localhost con el nombre de mi pc), pero al momento de publicarlo en IIS lo trata de buscar con el nombre del servidor y no tenemos dicho nombre realmente publicado o adquirido solo se trata del nombre del Servidor,,, ¿QUe opciones tengo en mi caso?

      Eliminar
  34. Muy buenos días disculpa necesito conecta mi web service con un programa y me pide un url y lo polo que me sale un erro como si mi url del web service es correcto

    ResponderEliminar
  35. hola Alex

    si pones la url en el browser esta muestra la pagina por defecto del asmx?

    recuerda que deberias poner en la url el nombre o ip de la pc remota donde esta el servicio, usar localhost no funciona desde otra pc

    saludos

    ResponderEliminar
  36. Hola Leandro.

    Un favor,


    ¿Cómo puedo pasar este código de C# a vb.net?


    Return _ListarClientes.Where(p => p.id = id).Select(p => String.Format("{0} {1}", p.Nombre, p.Apellido)).FirstOrDefault().ToString()

    ResponderEliminar
  37. hola martin

    podria ser algo como esto

    Return _ListarClientes.Where(Function(p) p.id = id).Select(Function(p) String.Format("{0} {1}", p.Nombre, p.Apellido)).FirstOrDefault().ToString()

    saludos

    ResponderEliminar
  38. Te agradezco la ayuda pero me manda el siguiente mensaje:

    "Overload resolution failed because no accessible"

    Es un ejercicio de WCF y esta es la funcion:

    Public Function BuscarClientes(id As Integer) As Integer Implements IService1.BuscarClientes
    Return _ListarClientes.Where(Function(p) p.id = id).Select(Function(p) String.Format("{0} {1}", p.Nombre, p.Apellido)).FirstOrDefault().ToString()
    End Function

    Saludos.

    ResponderEliminar
  39. Saludos

    Con el tip que me diste ya pude resolver el problema.

    Un abrazo y gracias.

    ResponderEliminar
  40. Hola Leandro
    gracias por compartir tus conocimientos y publicaciones.

    la pregunta es la siguiente.
    En visual studio.net. yo hice un proyecto de facturas para almacen, cree una aplicacion web ASP.NET hice las tres capas, logica del negocio, controladores y objetos, y puedo conectarme a la base de datos y hacer un CRUD.

    Ahora referente a la publicacion yo quiero hacer el mismo proyecto pero con servicios web.

    acaso creo un nuevo proyecto con la opcion que tiene .net....
    y escojo framework 3.5,,, aplicacion de servicio web de ASP.NET. y dentro creo el CRUD las tres capas, y en una aplicacion web solo creo la interfaz y llamo los metodos que cree en el servicio web??
    gracias

    ResponderEliminar
  41. hola Ervin

    pero vas a utilizar dos servidores diferentes uno para la parte de UI con aspx y otro para los servicio asmx ?
    porque sino separar fisicamente las capas dejando por un lado la presentacion y por el otro el negocio y persisitencia no tendria sentido

    vas a agregar complejidad innecesaria ya que el deploy lo harias en la misma pc

    ahora si la idea es usar desde la UI controles ajax quizas con jquery o algun framework de MVVM como ser Knockout o AngularJs eso es otra cosa alli si esta bueno, es mas seria mejor usar Web API

    a donde apunto es que si vas a usar un solo servidor web deja los proyectos todos juntos no desacoples fisicamente la presentacion del negocio sino es que alguna funcionalidad lo necesita

    saludos

    ResponderEliminar
  42. Hola Leandro, De ante mano agradecerte por el contenido de tu blog, me ha facilitado varias soluciones.

    Antes de leer este post ya había construido mi solución de servicio web, publico una lista de datos pero solo consumo uno, el ultimo de la lista.
    Mi solución se conecta a una DB, y publica una lista de datos...en teoría, por que al revisar el asmx donde me muestra el XML que contruye solo veo los datos de un registro.

    Agradezco me pudieras ayudar

    try
    {
    comando = new SqlCommand("miStoreProcedure", miConexion.Conexion());
    comando.CommandType = CommandType.StoredProcedure;
    comando.Parameters.Add("@Parametro", SqlDbType.Int).Value = Valor;
    reader = comando.ExecuteReader();
    while (reader.HasRows)
    {
    while (reader.Read())
    {
    db = new ClsBasePrueba();
    db.Codigo = Convert.ToInt32(reader["Codigo"]);
    db.Titulo = Convert.ToString(reader["Titulo"]);
    db.Desc = Convert.ToString(reader["Descripcion"]);
    db.Estado = Convert.ToInt32(reader["Estado"]);
    db.Id = Convert.ToInt32(reader["Id"]);
    }
    lst.Add(db);
    reader.NextResult();
    }
    }

    Parece que siempre se sobreescribe el registro....no ???

    ResponderEliminar
  43. hola Dimitri

    es que deberias usar:

    reader = comando.ExecuteReader();

    while (reader.Read())
    {
    ClsBasePrueba db = new ClsBasePrueba();
    db.Codigo = Convert.ToInt32(reader["Codigo"]);
    db.Titulo = Convert.ToString(reader["Titulo"]);
    db.Desc = Convert.ToString(reader["Descripcion"]);
    db.Estado = Convert.ToInt32(reader["Estado"]);
    db.Id = Convert.ToInt32(reader["Id"]);

    lst.Add(db);
    }


    en cada loop del while creas una nueva instancia que agregas a la lista

    saludos

    ResponderEliminar
  44. Leandro gracias, me funciono perfecto...ahora tengo que revisar el servicio que consume los datos por que me da un error, voy a revisarlo y si no tal vez te vuelva a preguntar.

    ResponderEliminar
  45. Hola Leandro siempre con articulos interesantes, una pregunta tendras algun pequeño tutorial sobre wcf en alguna aplicacion con BD, saludos

    ResponderEliminar
  46. hola nyvlem25

    la verdad no he escrito para con WCF
    aunque igualmente el uso de una db en un servidicio son temas independientes podrias acceder a la db con ado.net o quizas entity framework de la misma forma que lo haces para cualquier otra aplicacion

    lo unico punto quizas a tener en cuanta podria ser que los datos que recuperas deberas convertirlos a la clase del DataContract que el servicio retorne, pero para esto podrias usar la libreria automapper

    pero con conocer WCF lo de la db no lo afecta, la doc del msdn es muy completa
    Windows Communication Foundation
    saludos

    ResponderEliminar
  47. hola necesito crear un servicio web que en c# regrese la ip, lo tengo que entregar en dentro de un par de horas y no se como hacerlo ya lo intente de mil maneras pero solo me sale el hola mundo porfavor ayudame

    ResponderEliminar
  48. Estimado Leandro,

    Primero Felicitarte por el tiempo y la colaboracion que nos das a todos los que necesitamos de ayuda!
    un favor podrias restablecer el proyecto de ejemplo para descargarlo
    Gracias!!

    ResponderEliminar
  49. hola Roger

    pero el proyecto web de este articulo se puede descargar, esta publicado en onedrive

    saludos

    ResponderEliminar
  50. Buenas noches Leandro, te molesto porque tengo problemas al utilizar el webservice desde una aplicación ya publicada. Cuando la aplicación va a buscar los datos del ws el mismo informa el error: "The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Negotiate,NTLM'." Este problema no lo tengo ejecutando el ws desde visual studio pero si una vez publicado, te agradezco la ayuda.

    Saludos!

    ResponderEliminar
  51. hola Noë

    el problema seguramente se deba a como se definio la seguridad en el sitio, cuando se creo en el IIS

    no se que version de windows usas, para saber asi la version del IIS, pero valida el tema de seguridad

    iis autentication

    saludos

    ResponderEliminar
  52. Hola, buen post, pero no puedo descargar el archivo

    ResponderEliminar
  53. hola miguel

    que raro porque yo puedo acceder a OneDrive sin problemas

    validaste ingresar desde otra red, porque se que a veces por temas de seguridad las empresas bloquean el acceso

    saludos

    ResponderEliminar
  54. Hola me puedes ayudar no se como crear un web services el cual sea consumido por una aplicacion de escritorio en c# para que a traves del web services almacene y se traiga datos de mi base de datos la cual estoy ejecutando en java y mi ambiente de trabajo es visual studio 2010

    ResponderEliminar
  55. hola Luis

    lo que planteas no se como podria responderlo porque seria una explciacion muy larga

    quizas si acotas la pregunta a donde tienes problemas podriamos analizarlo

    la creacion del web service lo realizo en este articulo, la conexion a los datos requiere que conozcas ado.net
    para lo que de java quizas algo como esto ayude

    Cómo consumir servicios web en .Net desde Netbeans

    saludos

    ResponderEliminar
  56. Hola Leandro me podrias ayudar con un problema lo que pasa es que ya tengo creado mi web services y ahora quiero que desde windows form en un boton agregar este agregue a la base de datos ya con el web services consumido me podrias ayudas te dejo mi gmail.
    louis.cubo@gmail.com

    ResponderEliminar
  57. que tal Leandro, tengo problemas con un proyecto que realicé.
    lo que pasa es que al publicar, me crea la carpeta pero al abrirla está vacia.
    te ha sucedido en alguna ocasion?

    ResponderEliminar
    Respuestas
    1. hola

      entiendo que publicas usando la opcion del VS, la pregunta seria no se genera ningun error en la compilacion ?
      porque si hay un error no se publicara nada

      saludos

      Eliminar
  58. Hola Leandro, tenes algun ejemplo de contarse al web service de afip ? Gracias!

    ResponderEliminar
  59. Hola Leandro, tienes este Web Service en vb

    ResponderEliminar
    Respuestas
    1. hola,
      no lo tengo en vb.net, pero no deberia ser complejo convertir el codigo si usas
      Code Convert
      saludos

      Eliminar
  60. Hola Leandro, he terminado un proyecto EN ASP.NET MVC 4, y usa EF y SQL SERVER EXPRESS (localDB\v11.0), Podrias orientarme para publicar mi sitio en WINDOWS SERVER 2008.
    -¿Debo crear mi BD Primero en Windows Server y tomar el conecction string para publicar mi sitio?
    -¿Las Tablas se crean a partir del modelo edmx?
    Soy nuevo en esto, si requiero un poco de orientación Saludos

    ResponderEliminar
    Respuestas
    1. hola
      Seguramente debas crear la db en sql server usando la opcion "Generate Database Script from model" como se observa en la imagen
      saludos

      Eliminar
  61. Hola Leandro, de ante mano muchas gracias por tomarte la molestia de leer mi comentario,
    mi situación es la siguiente:

    Tengo una aplicación muy grande y completa, la cual no desarrolle yo.
    Soy recién egresado y tengo 3 semanas que conseguí mi primer empleo, y aquí es donde me dieron está aplicación web, para liberarla en el servidor de un cliente, pero antes tenía que probarla de forma local y verificar que funcionaba al 100, le salieron varios inconvenientes los cuales tuve que corregir.
    Después de tener ya todas las correcciones y verificar que en visual studio 2012 funcionaba ya al 100%, la liberé en IIS, y es aquí que me genero un incoveniente.

    La aplicación genera un reporte del usuario, lo convierte en PDF y lo manda a su correo, el servidor SMTP que tenía la aplicación el cual enviaba los correos, ya no estaba disponible, por lo cual creé una cuenta en gmail para la aplicación y que está enviara los correos, lo hice de manera diferente a como venía.

    Entonces al liberarla en IIS me manda un mensaje cuando se está enviando el correo: "El servidor de correo falló, intentalo más tarde". pero lo mas curioso o más raro, es que al chechar la cuenta de correo del usuario y llega el correo con el reporte en PDF, y si le das aceptar al mensaje que aparece, empieza a envíar de nuevo el correo y vuelve a salir el mensaje y el correo vuelve a llegar al correo del usuario.

    Decidí comentar los mensajes de alerta, y ahora lo que hace es actuilzarse la pagina y enviar correo uno tras otro, y no pasa a la siguiente pagina como debería de hacerlo, estó en IIS ya que al ejecutarlo directamente desde visual studio, no me genera ningún problema.
    Es algo compliciado, no sé si me puedas dejar tu correo para poderte mandar capturas y etc.

    y de ante mano GRACIAS, espero me puedas contestar por favor.

    ResponderEliminar
    Respuestas
    1. hola

      revisaste los datos de configuracion de smtp para ver si tienes un servidor valido por donde enviar los mail?

      podrias capturar el mensaje de error, con un try..catch y loguear el mensaje de error que se produce, el sea el Message ya que por lo que comentas parece ser que ante un error muestra un mensaje fijo y no el mensaje del problema que se genera en .net

      no es cuestion de comentar la alerta, sino capturar el exception y ver el mensaje real del error

      saludos

      Eliminar
  62. Buenas tardes. Voy a ser breve. Sucede que tengo ya publicado un proyecto MVC 4. (no está termiando) y aun hago modificaciones. El problema es que las carpetas Content y Scripts contienen bastante información. Al darle a la opcion publicar todo va correctamente pero me sube todo otra vez,,....y yo preferiria que solo subiera los archivos modificados. ¿Esto es posible? ...y si lo es ¿Cómo puedo hacerlo?. Gracias de antemano, la verdad que me ahorraria muchas horas poder conseguir algo asi.

    ResponderEliminar
  63. Estimado Leandro,
    Tengo una duda sobre las mejor forma de conectar un sitio web (desarrollado en asp.net con vb) con la base de datos (SQL Server), mediante conexión directa a sql o por medio de web service.

    ResponderEliminar
    Respuestas
    1. hola
      Si la db esta local en la misma red (o la misma pc) del servidor web (donde alojas el IIS) en ese caso la conexion que sea directa
      Ahora si un cliente local en el cliente y la db esta remota y el acceso es por internet, en ese caso justifica que los datos los expongas por meiod de servicio web, para que el cliente los consuma
      saludos

      Eliminar
  64. Hola Leandro;
    Estoy viendo la posibilidad de agregar a mi pagina web la opcion de tomar las coordenadas gps desde el dispositivo que sea, tablet, celular (no es una app para smartphone) y que al seleccionar esa opcion envie las coordenadas de ese dispositivo (si tiene gps) a mi base de datos. Es posible? Muchas gracias.-
    Saludos.-

    ResponderEliminar
    Respuestas
    1. hola
      podrias tomar las coordenadas usando javascript o jquery y luego enviarlas al servidor mediante una llamada ajax al servidor
      Using jQuery to Consume ASP.NET JSON Web Services
      saludos

      Eliminar
    2. Muchas gracias Leandro. Lo estare probando y te aviso como me fue. Muchas gracias.-

      Eliminar
  65. hola buenas noche un pregunta tengo un serrvicio web y quiero publicarlo en un servidor pero a la hora de hacerlo me aparecen varios warnings pero sin errores y no me lo publica, nose si haya alguna manera de poder publicarlo sin hacerle caso a los warnings. gracias saludos

    ResponderEliminar
    Respuestas
    1. Podria ser que no tengas el archivo Default.

      Eliminar
  66. Que tal Leandro como estas una pregunta.

    Hicimos un windows service para timbrado de facturas, este aplicativo consume un web service rest que es el encargado de timbrar las facturas, este es de un tercero, esta aplicacion ya la implementamos en un servidor con internet y funciona correctamente, pero ahora intentamos implementar este mismo windows service en un servidor que no tiene internet y que tiene todo restringido, para esto solicitamos que nos abrieran el puerto que usa nuestro servicio REST y este ya responde correctamente desde el explorador, pero aun con el puerto abierto no logramos establecer comunicacion con el servicio REST desde el windows service, este es el error que manda, There was no endpoint listening at https://factura.test.com.mx:XXXX/efacturaws/EfacturaService that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

    alguna idea de que este pasando o si hay algun puerto que se tenga que abrir y que no este contemplando?

    saludos cordiales

    JOSE LUIS

    ResponderEliminar
  67. Buenas tardes,
    Disculpa Leandro como puedo hacer para desde mi aplicacion web service crear una clase conexion y sus metodos para conectarme a una base de datos de mysql. Esto lo quiero hacer para consultar desde mi web service el login de mi aplicacion de escritorio. Lo deseo hacer de esa manera debido a que es un requerimiento especifico de un proyecto que me pidieron. Si me puderias guiar te estaria muy agradecido.

    ResponderEliminar
  68. hola Leandro buenos dias tengo una duda , mira estoy desarrolando en vs 2015 y esta funcionando la solucion en IIS pero al hacer cambios me pega tambien en IIS y luego a los usuarios de la solucion les manda error por los cambios que hago, como hacer para que no suceda eso.

    Saludos

    ResponderEliminar
  69. Hola Leandro, buenas tardes

    Espero puedas ayudarme, el webservice en el que estoy trabajando tiene dos métodos solamente, insertar y consultar datos en una BD (SQL) a un servidor externo, de forma local funciona correctamente(BD en mi equipo) pero al intentar usar ese servidor me manda el siguiente error:

    System.ArgumentNullException: Value cannot be null.
    Parameter name: composite at ServicioCC.ServicioCC.SetDatos(Dato[] Datos, String valor1, String valor2)

    ResponderEliminar
    Respuestas
    1. hola
      Validaste que los datos que envias en el parametro Dato[] no tenga ningun null como valor? podrias poner algun break en el codigo he inspeccionar las variables que envias cuando invocas el SetDatos()
      saludos

      Eliminar
    2. Hola Leandro

      El problema era una instrucción que estaba usando ese parámetro dentro de la función SetDatos(), gracias por tu respuesta.

      Eliminar
  70. Hola Leandro, buen día

    Tengo un problema con un web service, al momento de agregar la referencia del servicio se hace correctamente y se puede acceder a las clases y métodos del servicio, el problema al realizar la conexión muestra un error en System.ServiceModel.ClientBase.Channel el cual produce una excepción de tipo System.InvalidOperationExcpetion, y este es el mensaje que muestra la excepción ("Error al reflejar 'item'")

    Espero puedas ayudarme, de antemano gracias.

    ResponderEliminar
  71. Buen Día Leandro,

    Consultarte un tema, tengo que unificar unos servicios web de asp net 2.0 de correos, por ello, estoy pensando hacerlo en WCF, sólo tengo una duda cuando migre a WCF los servicios, las aplicaciones clientes serán compatibles con el nuevo servicio?
    Podría ocurrir un problema por el framework, ya que wcf es desde 3.5.

    Quedo atento a tu ayuda.

    Muchas Gracias.

    ResponderEliminar
  72. Hola Leandro,mi caso, es que tengo un webservice que actualiza una base de datos con algunos parametros enviados, pero desde ese mismo webservice debo consumir otro publicado en una url diferente, y que actualiza una base de datos distinta. me podrias guiar como invoco al otro webservice? Gracias

    ResponderEliminar
  73. Buen día Leandro.

    Podrías guiarme en como consumir un WebService desde un dispositivo con Windows Mobile 6.x

    Gracias.

    ResponderEliminar
  74. Hola Leandro con el gusto de saludarte y preguntarte si es posible rellenar un numericupdown de ajax con un web service que consulta una vista al sql gracias un saludo.

    ResponderEliminar
  75. Buenas tardes, como estas?
    Cuando publicas un WS hay posibilidad si el mismo tira error que se genere un listado de errores?

    ResponderEliminar
  76. Buenos días Leandro, muchas gracias por tu blog, me ha sido de gran ayuda para intentar consumir un webservice local desde internet. Siguiendo tus indicaciones he configurado el IIS del equipo local (donde está físicamente el archivo wsdl) y he abierto los puertos correspondientes en mi router.

    El archivo wsdl parece que lo coge bien, ya que al hacer $soap->__getFunctions() me muestra el listado de las funciones del wsdl. También he comprobado que al poner en el navegador la dirección del wsdl, carga el contenido xml del mismo desde cualquier ubicación.

    El problema me surge al llamar a cualquier método del webservice, me lanza error:
    SoapFault exception: [HTTP] Could not connect to host in /home/accesoprqf/www/ws.php:109 Stack trace: #0 [internal function]: SoapClient->__doRequest('__call('InitializeDevic...', Array) #2 /home/accesoprqf/www/ws.php(109): SoapClient->InitializeDevice(Object(MyHeader))

    Después de llamar al método, si hago $soap->__getLastRequest() me muestra " 201962x0 ", por lo que entiendo que sí envía la información. En cambio al hacer $soap->__getLastResponse() devuelve "NULL"

    Te agradecería cualquier orientación que puedas darme. Soy novata en webservice y la verdad es que me estoy volviendo loca para hacerlo funcionar.

    ResponderEliminar
  77. Hola Leandro, una consulta estoy invocando una web services en VS2008 Windows Form pero al importar la referencia en mi còdigo, no se muestra la web services agregada, dime se hace alguna configuracion en el App.Config ??

    Agradeceria que me apoyes

    ResponderEliminar
  78. hola, me gustaría saber si tienes algunos consejos para mejorar la calidad de seguridad del sitio web usando .net

    ResponderEliminar