在Azure上,当HttpContext.Current.User.Identity.IsAuthenticated与Webmethods一起使用时,在一段时间不活动后停止工作。

29

我正在使用使用Ajax(json)/Webmethod功能测试Azure服务器。

其中一些函数在运行代码之前会检查HttpContext.Current.User.Identity.IsAuthenticated。不幸的是,如果用户已经登录且页面没有向服务器发出完整的postback请求,那么只有那些检查HttpContext.Current.User.Identity.IsAuthenticated的WebMethod函数会在几分钟后完全停止运行,而且不会给出任何错误信息。它们甚至不运行else代码块(如下所示)。

我已经在本地服务器上测试了这些页面,一切正常,即使长时间闲置也没有问题。这里是一个WebMethod的例子:

[WebMethod]
public static string serviceMenu(int IDservice)
{
        StringBuilder SBphotoMenu = new StringBuilder();            
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            // Do stuff
        }
        else
        {
           // Do other stuff
        }

        return SBphotoMenu.ToString();
}
我正在如下调用web方法:
function serviceMenu(IDservice) {
$.ajax({
    type: "POST",
    url: "/UserControls/serviceMenu",
    data: "{ IDservice: " + IDservice }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        // Do Stuff        
    }
})
}

只有在用户登录的情况下才会出现这种行为。如果用户未登录,则即使在Azure上,所有功能也能正常工作。

事实上,当Web方法停止运行并刷新页面时,用户仍然登录,并且Web方法再次开始运行,但仅持续几分钟,之后又出现相同的行为。

出了什么问题?


你为什么要把用户认证放在方法中而不是Global.asax或某个基类中? - Martin Valentino
那么你说的停止工作是什么意思?是指在身份验证停止工作时总是进入else逻辑吗? - Martin Valentino
@Gloria,请将您的解决方案发布为答案并接受它,以便问题保持在SE格式中并得到解决。谢谢。 - Michael Coxon
我可以接受自己的问题作为答案吗? - Gloria
不,只需将您的评论(以及问题所在)复制到下面的“您的答案”部分中,然后在页面刷新后接受它。 - Ron DeFreitas
显示剩余15条评论
1个回答

0
问题是由会话变量而不是身份验证引起的。实际上,在使用默认的“inProc”方法在Azure中运行ASP.NET应用程序时,会话状态无法维护。Azure使用其他方法,其中一些代价高昂:表存储、SQL Azure或Windows Azure缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接