Pregunta

Es necesario crear un servicio WCF que está alojado en IIS, utiliza http transporte y estado de retención en la memoria del servidor. Aunque soy consciente de que los servicios con estado no son una buena idea, esta última restricción es necesaria para hacer el trabajo de servicio con un cliente heredado.

Mi primera idea fue la sesión de asp.net para almacenar los valores. He activado el modo de compatibilidad asp.net en mi servicio, que me dio acceso a los HttpContext, pero los valores que fueron colocados en el objeto de sesión no estaban siendo mantenido en la memoria. Asumo que esto era debido a que el módulo HTTP que el estado de sesión mangos no se ha configurado correctamente, pero cuando google para respuesta me encontré, sesiones de WCF y pensé que podría ser una idea mejor usarlos.

Sin embargo, las sesiones de WCF parecen lo bajo-documento y el lugar una extraña serie de prerequises en un servicio, y no he sido capaz de encontrar una configuración que se adapte a mis necesidades: debe estar alojado en IIS, debe utilizar HTTP o HTTPS transportar y no puede responder sobre la autentificación de windows debido a que el cliente y el servidor no serán parte del mismo dominio. Estoy tratando de obtener esta pasando con el wsHttpBinding, había oído sesiones de WCF requeridos ya sea de seguridad o un mensaje fiable, pero: - El uso de la unión estándar y cuando los servidores no son parte del mismo dominio que falla con un “SecurityNegotiationException La persona que llama no fue autenticado por el servicio” es una excepción. Esto es bastante lógico, ya que se utiliza seguridad de Windows.

  • Si la seguridad desactivar la completo falla con un “Contrato requiere sesión, pero 'wsHttpBinding' La unión no lo soporta o no está configurado correctamente para apoyarlo.”

  • Si mientras está incapacitado mantener la seguridad habilito mensaje fiable consigo la excepción “La unión de validación ha fallado porque el wsHttpBinding no soporta sesiones fiables sobre la seguridad del transporte (HTTPS). No se pudo abrir la fábrica de canal o host de servicio. Uso seguridad de los mensajes para mensajería segura y fiable a través de HTTP “.

  • He intentado habilitar la seguridad de nivel de transporte, pero esto no parece hacer ninguna diferencia para el error generado

¿Hay alguna configuración que la fuerza de trabajo para mí? ¿O debo volver al plan de usar las sesiones ASP.NET?

¿Fue útil?

Solución

Puede tener WCF información de la sesión de retención en la memoria de una manera sencilla bonita. Para eliminar cualquier influencia externa posible en mis instrucciones, voy a suponer que esté comenzando con un nuevo proyecto:

  1. Crear un nuevo proyecto WCF Biblioteca Servicio. Este proyecto ya contendrá un servicio con un WSHttpBiding unión preconfigurado.
  2. Ir al contrato de servicios (IService1.cs) y cambiar el atributo ServiceContract a lo siguiente:

    [ServiceContract(SessionMode = SessionMode.Required)]
    
  3. Ir a la implimentation servicio (Service1.cs) y añadir el siguiente atributo ServiceBehavior a la clase de servicio (Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    
  4. Agregar datos de la sesión como miembros de la clase de servicio (Service1):

    public class Service1 : IService1
    {
        ...
    
        private string UserFullName { get; set; }
    
        ...
    }
    
  5. Usar los miembros a los datos específicos actual período de sesiones (recuerde también añadirlos al contrato de servicio, IService1):

    public class Service1 : IService1
    {
        ...
    
        public string Welcome(string fullName)
        {
            UserFullName = fullName ?? "Guest";
            return string.Format("Welcome back, {0}!", UserFullName);
        }
    
        public string Goodbye()
        {
            return string.Format("Come back soon, {0}!", UserFullName ?? "Guest");
        }
    
        ...
    }
    

SessionMode.Required asegura que sus clientes por sesión de seguimiento.
InstanceContextMode.PerSession asegura que se crea una instancia de la clase de servicio (Servicio1) por cada sesión, por lo que se puede retener datos de la sesión en que se ponga a existir en la memoria a través de múltiples llamadas en la misma sesión.
ConcurrencyMode.Single asegura que sólo un hilo puede entrar en cada instancia de clase de servicio (Servicio1), y evita posibles problemas de concurrencia si sólo los datos de acceso de la clase de servicio (y ubicaciones externas compatibles con el proceso).

EDIT: Por defecto, WSHttpBinding sólo permite sesiones de seguridad. Pero también soporte a las sesiones fiables, que permiten el establecimiento de sesiones sin habilitada la seguridad. La desactiva la configuración después de la unión de seguridad y permite que las sesiones confiables:

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

Otros consejos

OMI esto es lo que sucede cuando se está utilizando una tecnología con un pobre abstracción a través de HTTP como WCF. El hecho de que los servicios web de WCF en teoría podrían ser alojados sin HTTP (es decir, sobre la red TCP, MSMQ, etc.) sólo hace que sea difícil de usar una función de características de HTTP sin entrar en el infierno de configuración e inicie un juego de "adivinar la configuración correcta por ensayo y error" en el que tratar cada posible permutación de configuración hasta que haya encontrado el correcto que funciona!

En última instancia, si no se podía usar WCF y tuvo que implementar el servicio web desde cero sólo tendría que establecer una cookie cuando el cliente autenticado correctamente. Luego, con cada solicitud de cliente sólo tienes que tomar la información de sesión al que hace referencia esa cookie.

Una solución posible si se tenía que utilizar WCF es tomar la gestión de sesiones en sus propias manos (Es lo que hago cuando estoy satisfecho con el esfuerzo requerido para conseguir algo de trabajo) y tienen una explícita propiedad 'sesión' en todos sus servicios web que requieren una sesión / autenticación (por lo general un GUID generado en la autenticación). Así que para cada solicitud posterior se utiliza el GUID para rehidratar la información de sesión asociado a ese cliente.

Si está interesado en probar diferentes marcos de servicios web que mantengo una Open Source Web Services Framework que permite se construye sin configuración, DRY, servicios web, donde comprobables (sin ningún tipo de configuración requeridos) cada servicio web se crea automáticamente es accesible a través de REST XML, JSON, JSV, SOAP 1.1, SOAP 1.2 puntos finales. Efectiva que le permite acceder a su mismo servicio web a través de un URL HTTP GET para los clientes REST-ful y fácil de depuración, así como criterios de valoración de jabón (una opción popular sigue siendo el mandato de algunas empresas). El Hello World tutorial debe darle una buena visión general de algunas de sus características y cómo funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top