Отключить cookie-файл, чтобы заставить клиента перейти на другой узел приложения Azure.

У меня есть веб-приложение C#, которое использует компонент (Progress Telerik Sitefinity CMS), который занимает много времени (2 минуты) для инициализации. Пользователь, который посещает сайт на этом этапе, будет перенаправлен на страницу, которая опрашивает состояние каждую секунду до завершения инициализации. (Это встроенное поведение Sitefinity).

Я размещаю свое приложение в службе приложений Azure. Если я увеличу количество экземпляров (увеличу масштаб), некоторые из моих пользователей окажутся на новом узле, пока он еще инициализируется. Проблема в том, что из-за схожести cookie Azure они остаются на этом узле.

Я хочу сходства, кроме случаев, когда сайт инициализируется. В этом случае я хочу удалить куки и опросить. В этом случае мне назначают случайный узел, поэтому инициализированный узел находится в течение нескольких секунд.

Вопрос: как мне этого добиться? Многое из того, что происходит, обрабатывается в Sitefinity, поэтому я прибегнул к изменению контента в моем global.asax. Не работает Я попытался поместить это в мой global.asax.cs:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    var path = HttpContext.Current.Request.Url.AbsolutePath;
    // "/sitefinity/status" is the page the client is redirected to
    // "/appstatus" is used to poll initialization status
    if (path == "/appstatus" || path == "/sitefinity/status")
    {
        // "ARRAffinity" is the Azure affinity cookie
        Response.Cookies.Remove("ARRAffinity");
        // just removing the cookie didn't work so i tried to override it
        Response.Cookies.Add(new HttpCookie("ARRAffinity", "-") { HttpOnly = true });
        // reportedly, this suppresses cookie adding by Azure
        Response.Headers.Add("ARR-Disable-Session-Affinity", "true");
    };
}

Как заставить мой клиент перейти на другой узел?

РЕДАКТИРОВАТЬ Я думаю, что я нашел (часть) проблемы здесь.

  • Сначала запрашивается "/". Это возвращает перенаправление 302, но также и файл cookie ARRAffinity.
  • Затем запрашивается "/sitefinity/status". И ARR-Disable-Session-Affinity, и cookie удаляются. Это означает, что cookie не очищается на клиенте.
  • Во время опроса клиент уже имеет cookie. Таким образом, пользователь никогда не перенаправляется на другой узел.

Так что это может быть проблемой. Теперь, чтобы решить это...

РЕДАКТИРОВАТЬ

Я последовал совету Веселина Василева и добавил его в файл конфигурации моих сайтов:

<appSettings>
    <add key="sf:AppStatusPageResponseCode" value="503" />
</appSettings>

Но так как я до сих пор случайно достигаю узла инициализации, я также подавил cookie-файл, изменив свой global.asax.cs:

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var httpCode = Response.StatusCode;
        var isRedirectBackFromStatusPage = httpCode == 302 && Request.Url.AbsolutePath == "/sitefinity/status";
        var isFinalSitefinityStatusPoll = httpCode == 404 && Request.Url.AbsolutePath == "/appstatus";
        if (isRedirectBackFromStatusPage || isFinalSitefinityStatusPoll)
        {
            var cookie = Request.Cookies["ARRAffinity"];
            if (cookie != null) Response.Cookies.Add(cookie);
            return;
        }
        if (httpCode != 200 || !Response.ContentType.StartsWith("text/html"))
        {
            Response.Headers.Add("ARR-Disable-Session-Affinity", "true");
        };
    }

1 ответ

Решение

Почему бы вообще не отключить cookie-файл arr? Бэкэнд Sitefinity работает отлично, без файла cookie и с несколькими экземплярами.

РЕДАКТИРОВАТЬ: нам нужно сообщить Azure, что сайт еще не готов во время инициализации Sitefinity. Проблема в том, что страница appStatus (показанная Sitefinity во время инициализации) возвращает код состояния 302 и даже 200, что заставляет Azure полагать, что сайт работает нормально. Я писал об этом здесь: https://sitefinitydevelopment.com/blog/sitefinity's-application-status-page-can-cause-you-big-problems.html В зависимости от версии Sitefinity, вы можете реализовать собственное решение. там (вручную возвращая http-код 503 при перезагрузке системы) или установите следующий параметр в файле web.config (Sitefinity 9+)

<add key="sf:AppStatusPageResponseCode" value="503" />
Другие вопросы по тегам