抑制关联性 cookie 以强制客户端到另一个 Azure 应用程序节点
Suppress affinity cookie to force client to another Azure app node
我有一个 C# Web 应用程序,它使用需要很长时间(2 分钟)初始化的组件 (Progress Telerik Sitefinity CMS)。在此阶段访问该站点的用户将被重定向到每秒轮询一次状态的页面,直到初始化完成。 (这是内置的 Sitefinity 行为)。
我在 Azure 应用服务中托管我的应用程序。如果我增加实例的数量(扩大规模),我的一些用户会在新节点仍在初始化时结束。问题是,由于 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");
};
}
如何强制我的客户端到不同的节点?[=14=]
编辑
我想我找到了(部分)问题 here。
- 首先,请求“/”。这个 returns 一个 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");
};
}
为什么不完全禁用 arr affinity cookie?
Sitefinity 后端在没有 arr cookie 和多个实例的情况下工作正常。
编辑:我们需要在 Sitefinity 初始化期间告诉 Azure 该站点尚未准备就绪。问题在于,appStatus 页面(在初始化期间由 Sitefinity 显示)returns 状态代码 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" />
我有一个 C# Web 应用程序,它使用需要很长时间(2 分钟)初始化的组件 (Progress Telerik Sitefinity CMS)。在此阶段访问该站点的用户将被重定向到每秒轮询一次状态的页面,直到初始化完成。 (这是内置的 Sitefinity 行为)。
我在 Azure 应用服务中托管我的应用程序。如果我增加实例的数量(扩大规模),我的一些用户会在新节点仍在初始化时结束。问题是,由于 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");
};
}
如何强制我的客户端到不同的节点?[=14=]
编辑 我想我找到了(部分)问题 here。
- 首先,请求“/”。这个 returns 一个 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");
};
}
为什么不完全禁用 arr affinity cookie? Sitefinity 后端在没有 arr cookie 和多个实例的情况下工作正常。
编辑:我们需要在 Sitefinity 初始化期间告诉 Azure 该站点尚未准备就绪。问题在于,appStatus 页面(在初始化期间由 Sitefinity 显示)returns 状态代码 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" />