none
asmx a wcf soap RRS feed

  • Pregunta

  • hola foro:


    Estoy pasando de asmx a wcf . Como puedo hacer para crear como en  asmx soap header , es para permitir un filtro por cuil del cliente y tambien para hacer logueos al entrar y salir de los webmethods

    gracias


    lunes, 21 de diciembre de 2015 17:20

Respuestas

  • En el servicio WCF puedes usar un [MessageContract] en lugar del [DataContract]. Dentro del MessageContract, marcas como [MessageHeader] los datos que tengan que ir dentro de las cabeceras SOAP.

    https://msdn.microsoft.com/en-us/library/ms730255(v=vs.110).aspx

    • Propuesto como respuesta Christian AmadoMVP miércoles, 23 de diciembre de 2015 11:33
    • Votado como útil Christian AmadoMVP miércoles, 23 de diciembre de 2015 11:47
    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:21
    lunes, 21 de diciembre de 2015 18:22
  • hola

    WCF es mas avanzado que un simple asmx, no necesitas especificar un header para pasar las credenciales, puedes usar la propiedad Credentials del proxy que se crea en el cliente

    using(ProxyService svc = new ProxyService()){

    svc .UseDefaultCredentials = false; svc .Credentials = new NetworkCredential("userName", "password", "domain"); //aqui invocas webmethod }

    por supuesto esto es lo basico, pasar las credenciales

    podrias crear un custom binding que las use para validar el servicio

    Username Authentication over basicHttpBinding with WCF’s ChannelFactory Interface

    WCF tiene muchos puntos de intercepcion que puedes definir mediente binding, pero recomendaria que leas algo al respecto porque sino entiendes que es un binding te sera imposible implementarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:21
    martes, 22 de diciembre de 2015 21:53
  • otros ejemplos

    Tutorial: Crear credenciales de cliente y servicio personalizadas

    como veras es tan extensible que quizas no resulte tan simple, pero si muy potente en cuanto a la capacidad de extender la funcionalidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:20
    martes, 22 de diciembre de 2015 21:58
  • Hola Inovador2015, lo que estás necesitando es un estándar de cabecera para WS-Security. Cuando se agrega una referencia de servicio generalmente se crea (automáticamente) un enlace (binding) que proviene de la clase basicHttpBinding, el cual se crea en el archivo de configuración (en donde se crea la referencia del servicio). Simplemente, se debe incluir un elemento de seguridad con el modo TransportWithMessageCredential y el elemento de seguridad clientCredentialType con el nombre de usuario. En tu archivo de configuración aparecería algo así:

    <basicHttpBinding>
      <binding name="nombreX">
        <security mode="TransportWithMessageCredential">
          <message clientCredentialType="NOMBRE_USUARIO_AQUI"/>
        </security>
      </binding>
    </basicHttpBinding>

    El archivo de configuración está indicando al WCF que espera un usuario y contraseña en la cabecera SOAP a través del protocolo HTTP/S,según el caso. Entonces, lo que resta es establecer el usuario y contraseña luego de realizar a llamada al servicio:

    var servicio = new TuClienteDeServicio();
    servicio.ClientCredentials.UserName.UserName = "NOMBRE_USUARIO";
    servicio.ClientCredentials.UserName.Password = "CONTRASEÑA";

    Espero resulte útil.

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    My Blog
    My code samples

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:20
    miércoles, 23 de diciembre de 2015 11:47

Todas las respuestas

  • En el servicio WCF puedes usar un [MessageContract] en lugar del [DataContract]. Dentro del MessageContract, marcas como [MessageHeader] los datos que tengan que ir dentro de las cabeceras SOAP.

    https://msdn.microsoft.com/en-us/library/ms730255(v=vs.110).aspx

    • Propuesto como respuesta Christian AmadoMVP miércoles, 23 de diciembre de 2015 11:33
    • Votado como útil Christian AmadoMVP miércoles, 23 de diciembre de 2015 11:47
    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:21
    lunes, 21 de diciembre de 2015 18:22
  • gracias por responder, como podria hacer para que loguee al entrar y al salir de lo webmethod, tambine se puede pone como messageheader?
    lunes, 21 de diciembre de 2015 18:50
  • hola

    WCF es mas avanzado que un simple asmx, no necesitas especificar un header para pasar las credenciales, puedes usar la propiedad Credentials del proxy que se crea en el cliente

    using(ProxyService svc = new ProxyService()){

    svc .UseDefaultCredentials = false; svc .Credentials = new NetworkCredential("userName", "password", "domain"); //aqui invocas webmethod }

    por supuesto esto es lo basico, pasar las credenciales

    podrias crear un custom binding que las use para validar el servicio

    Username Authentication over basicHttpBinding with WCF’s ChannelFactory Interface

    WCF tiene muchos puntos de intercepcion que puedes definir mediente binding, pero recomendaria que leas algo al respecto porque sino entiendes que es un binding te sera imposible implementarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:21
    martes, 22 de diciembre de 2015 21:53
  • otros ejemplos

    Tutorial: Crear credenciales de cliente y servicio personalizadas

    como veras es tan extensible que quizas no resulte tan simple, pero si muy potente en cuanto a la capacidad de extender la funcionalidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:20
    martes, 22 de diciembre de 2015 21:58
  • gracias alberto y leandro  por sus aportes , Si lei que es mas complejo ,sobre todo comparado con asmx, voy a mirar lo que me pasaron . 

    Voy a revisar lo que me pasaron, para ver si puedo registrar el logueo de lo que entra y sale del servicio 


    • Editado Inovador2015 miércoles, 23 de diciembre de 2015 2:18
    miércoles, 23 de diciembre de 2015 2:18
  • Hola Inovador2015, lo que estás necesitando es un estándar de cabecera para WS-Security. Cuando se agrega una referencia de servicio generalmente se crea (automáticamente) un enlace (binding) que proviene de la clase basicHttpBinding, el cual se crea en el archivo de configuración (en donde se crea la referencia del servicio). Simplemente, se debe incluir un elemento de seguridad con el modo TransportWithMessageCredential y el elemento de seguridad clientCredentialType con el nombre de usuario. En tu archivo de configuración aparecería algo así:

    <basicHttpBinding>
      <binding name="nombreX">
        <security mode="TransportWithMessageCredential">
          <message clientCredentialType="NOMBRE_USUARIO_AQUI"/>
        </security>
      </binding>
    </basicHttpBinding>

    El archivo de configuración está indicando al WCF que espera un usuario y contraseña en la cabecera SOAP a través del protocolo HTTP/S,según el caso. Entonces, lo que resta es establecer el usuario y contraseña luego de realizar a llamada al servicio:

    var servicio = new TuClienteDeServicio();
    servicio.ClientCredentials.UserName.UserName = "NOMBRE_USUARIO";
    servicio.ClientCredentials.UserName.Password = "CONTRASEÑA";

    Espero resulte útil.

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    My Blog
    My code samples

    • Marcado como respuesta Inovador2015 jueves, 24 de diciembre de 2015 17:20
    miércoles, 23 de diciembre de 2015 11:47
  • gracias
    jueves, 24 de diciembre de 2015 17:21