我有一个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。
这可能是问题所在。现在解决它......
修改的
我遵循了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");
};
}
答案 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" />