Une instance Windows Azure s »exécute derrière un système de load balancing matériel.

Ce matériel utilise un timeout de 60 secondes qui n »est pas modifiable de quelque manière que ce soit.
Cela a pour effet de couper la connexion après 60 secondes d »inactivité. Si votre application utilise des sockets et nécessite une connexion ouverte plus longtemps pour un transfert de données ou autre, vous devez contourner ce problème en utilisant ServicePointManager.SetTcpKeepAlive(). Les
paquets TCP Keep-Alive maintiennent la connexion entre votre client et l »équilibreur de charge lors d »une requête HTTP de longue durée.

Voici un exemple d »utilisation :

private void SetKeepAlive(Socket sock)
{
    int KeepAliveTime = 1000 * 45; // 45 seconds of inactivity allowed
    int KeepAliveInterval = 1000; // 1 second interval on keep-alive checks (default)
            
    my_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
    my_socket.IOControl(IOControlCode.KeepAliveValues, GetKeepAliveByte(KeepAliveTime, KeepAliveInterval), null);
}


// "consts" to help understand calculations
const int bytesperlong = 4; // 32 / 8
const int bitsperbyte = 8;

private byte[] GetKeepAliveByte(ulong time, ulong interval)
{
    // resulting structure
    byte[] SIO_KEEPALIVE_VALS = new byte[3 * bytesperlong];
    try
    {
        // array to hold input values
        ulong[] input = new ulong[3];

        // put input arguments in input array
        if (time == 0 || interval == 0) // enable disable keep-alive
            input[0] = (0UL); // off
        else
            input[0] = (1UL); // on

        input[1] = (time); // time millis
        input[2] = (interval); // interval millis

        // pack input into byte struct
        for (int i = 0; i < input.Length; i++)
        {
            SIO_KEEPALIVE_VALS[i * bytesperlong + 3] = (byte)(input[i] >> ((bytesperlong - 1) * bitsperbyte) & 0xff);
            SIO_KEEPALIVE_VALS[i * bytesperlong + 2] = (byte)(input[i] >> ((bytesperlong - 2) * bitsperbyte) & 0xff);
            SIO_KEEPALIVE_VALS[i * bytesperlong + 1] = (byte)(input[i] >> ((bytesperlong - 3) * bitsperbyte) & 0xff);
            SIO_KEEPALIVE_VALS[i * bytesperlong + 0] = (byte)(input[i] >> ((bytesperlong - 4) * bitsperbyte) & 0xff);
        }
    }
    catch (Exception)
    {
        return SIO_KEEPALIVE_VALS;
    }
    return SIO_KEEPALIVE_VALS;
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.