抑制关联cookie以强制客户端到另一个Azure应用程序节点

时间:2018-04-06 12:50:13

标签: azure azure-web-sites sitefinity session-affinity

我有一个C#Web应用程序,它使用一个组件(Progress Telerik Sitefinity CMS),需要很长时间(2分钟)来初始化。在此阶段访问该站点的用户将被重定向到每秒轮询该状态的页面,直到初始化完成。 (这是内置的Sitefinity行为)。

我在Azure App Service中托管我的应用程序。如果我增加实例数(向上扩展),我的一些用户会在新节点初始化时结束。问题是,由于Azure添加的关联cookie,他们保留在此节点上。

我想要亲和力,除非网站正在初始化。在这种情况下,我想删除cookie和民意调查。在这种情况下,我会被分配一个随机节点,因此可以在几秒钟内找到初始化节点。

问题是:我该如何实现这一目标?发生的很多事情都是在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");
    };
}

如何强制我的客户端到另一个节点?

修改的 我想我发现了(问题的一部分)here

  • 首先,请求“/”。这将返回302重定向,但也返回ARRAffinity cookie。
  • 然后,请求“/ sitefinity / status”。 ARR-Disable-Session-Affinity和cookie都被剥离。这意味着,客户端不会清除cookie。
  • 在轮询时,客户端已经拥有cookie。因此用户永远不会被重定向到另一个节点。

这可能是问题所在。现在解决它......

修改

我遵循了Vesselin Vassilevs的建议并将其添加到我的网站配置文件中:

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

但是因为我仍然偶然到达初始化节点,我还通过改变我的global.asax.cs来抑制关联cookie:

    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 个答案:

答案 0 :(得分:1)

为什么不完全禁用arr affinity cookie? Sitefinity后端工作正常,没有arr cookie和多个实例。

编辑:我们需要告诉Azure在Sitefinity初始化期间该站点尚未准备好。问题是,appStatus页面(在init期间由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" />