WCF Administrar información de estado de sesión

¿Cuál es la forma más escalable de administrar el estado en un WCF?

Solo necesito una sola variable para indicar una sesión y administraré la información relativa a la sesión en un MSSQL. No necesito saber cuándo termina una sesión. Una vez al día simplemente borraré las sesiones antiguas.

Parece que SessionID es esa variable.

Para la escala, estoy usando Por llamada ya que el ctor está vacío. No creo que necesite por sesión.

En mi prueba simple de EightBall, obtengo un ID de sesión que representa una sesión. Pero solo estoy probando en una sola caja.

Lo que me preocupa es que veo cierta documentación que necesito para activar ReliableSessionBindingElement y está desactivado de forma predeterminada.

¿Será SessionID un indicador confiable de sesión en la siguiente configuración?

<system.serviceModel>
    <services>
      <service name="MajicEightBallServiceLib.MagicEightBallService"
               behaviorConfiguration="EightBallServiceMEXBehavior" >
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="MajicEightBallServiceLib.IEightBall" />
        <endpoint address="mex"
                  binding ="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/MagicEightBallService"/>
          </baseAddresses>
        </host>             
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EightBallServiceMEXBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

[ServiceBehavior (InstanceContextMode=InstanceContextMode.PerCall)]
public class MagicEightBallService : IEightBall
{
    public MagicEightBallService()
    {
        Console.WriteLine("Eightball awaits your question ...");
    }
    public string ObtainAnswerToQuestion(string userQuestion)
    {
        return "maybe " + OperationContext.Current.SessionId.ToString();
    }

    public sDoc GetSdoc(int sID)
    {
        List<sDocProp> props = new List<sDocProp>();
        sDocProp prop1 = new sDocProp { ID = 1, Name = "Prop1", ArrivalStatus = ArrivalStatus.OnTime };
        props.Add(prop1);
        sDocPropStringSV prop2 = new sDocPropStringSV { ID = 1, Name = "Prop1", ArrivalStatus = ArrivalStatus.OnTime, Value = "StrValue1" };
        props.Add(prop2);
        sDoc sDoc = new sDoc { sID = sID, sParID = 1, Props = props, SessionID = OperationContext.Current.SessionId.ToString() };
        return sDoc;
    }

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

WCF admite 4 tipos de sesiones y la sesión confiable es solo una de ellas. Por lo tanto, no es necesario que active ReliableSessionBindingElement para habilitar la sesión. Puede utilizar otros tipos de sesión.

La System.ServiceModel.Channels.ReliableSessionBindingElement, que implementa la especificación WS-ReliableMessaging, brinda soporte para sesiones confiables en las que los mensajes se entregan en orden y exactamente una vez, lo que brinda confianza incluso cuando los mensajes viajan a través de múltiples nodos durante la conversación.

Actualmente wsHttpBinding por defecto utiliza una sesión segura que encripta y firma digitalmente los mensajes.

¿Será SessionID un indicador confiable de sesión en la siguiente configuración?

El servicio puede verificar si su enlace está configurado para usar la sesión usando ServiceContractAttribute.SessionMode atributo.

El siguiente contrato de servicio requiere que los enlaces configurados utilicen sesiones.

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IEightBall

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.sessionmode.aspx

¿Cuál es la forma más escalable de administrar el estado en un WCF?

InstanceContextMode.PerCall es la elección correcta si su código no depende de ningún dato de sesión, excepto el ID de sesión. El ID de sesión es parte del mensaje de WCF, por lo que no es necesario mantener InstanceContext más tiempo del necesario para procesar la solicitud.

Otra pregunta:

¿Será SessionID un indicador confiable de sesión en la siguiente configuración?

La respuesta es SÍ. A continuación se muestra el código de propiedad de ingeniería inversa System.ServiceModel.OperationContext.SessionId. Como se puede ver SessionId se carga desde Channel.Session y no vacío SessionId el valor se devuelve solo si Session No es nulo.

public string SessionId
{
    get
    {
        if (this.channel != null)
        {
            IChannel innerChannel = this.channel.InnerChannel;
            if (innerChannel != null)
            {
                ISessionChannel<IDuplexSession> sessionChannel = innerChannel as ISessionChannel<IDuplexSession>;
                if (sessionChannel != null && sessionChannel.Session != null)
                {
                    return sessionChannel.Session.Id;
                }
                ISessionChannel<IInputSession> sessionChannel2 = innerChannel as ISessionChannel<IInputSession>;
                if (sessionChannel2 != null && sessionChannel2.Session != null)
                {
                    return sessionChannel2.Session.Id;
                }
                ISessionChannel<IOutputSession> sessionChannel3 = innerChannel as ISessionChannel<IOutputSession>;
                if (sessionChannel3 != null && sessionChannel3.Session != null)
                {
                    return sessionChannel3.Session.Id;
                }
            }
        }
        return null;
    }
}

Respondido el 13 de junio de 12 a las 15:06

Mucha buena información, pero por favor sea claro en la siguiente pregunta. "¿Será SessionID un indicador confiable de sesión en la siguiente configuración?" - paparazzo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.