C# 某些服务器上的HttpContext.Current.Session为空

C# 某些服务器上的HttpContext.Current.Session为空,c#,asp.net-mvc,asp.net-membership,C#,Asp.net Mvc,Asp.net Membership,我希望这是一个简单的问题。我从来没有处理过这个问题,甚至不知道如何开始 我开发了一个web应用程序,我的用户可以在他们自己的web服务器上安装和运行 我实现了一个特性,允许他们的用户从默认的pw更改pw。这在几乎所有的服务器上都能完美地工作。但是,我有一个新客户不能使用它 当前的方法遵循以下步骤: 用户使用默认pw登录 用户被带到必须创建新pw的视图(否则其帐户将被挂起) 成功更改pw后,用户将进入主屏幕 对大多数公司来说,这是意料之中的事。但是,在这台服务器上,Membership.GetUs

我希望这是一个简单的问题。我从来没有处理过这个问题,甚至不知道如何开始

我开发了一个web应用程序,我的用户可以在他们自己的web服务器上安装和运行

我实现了一个特性,允许他们的用户从默认的pw更改pw。这在几乎所有的服务器上都能完美地工作。但是,我有一个新客户不能使用它

当前的方法遵循以下步骤:

  • 用户使用默认pw登录
  • 用户被带到必须创建新pw的视图(否则其帐户将被挂起)
  • 成功更改pw后,用户将进入主屏幕
  • 对大多数公司来说,这是意料之中的事。但是,在这台服务器上,
    Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name)
    始终为空,因为
    Current
    为空。如果我在本地运行应用程序并连接到他们的数据库,它将按预期工作。但是,如果我在他们的服务器上运行它(只在连接到完全相同的数据库的服务器上运行相同的代码),则该值为null,pw更改失败

    我需要提供哪些其他信息来帮助解决此问题

    更新:以下是我调用的代码: 按下按钮时调用的脚本:

    var $account = {
    changePw: function (homeUrl, reset) {
        $(".ui-widget").css("display", "none");
        var newPw1 = $("#newPw1").val();
        var newPw2 = $("#newPw2").val()
        if (newPw1 != newPw2) {
            $("#pwDontMatch").css("display", "block");
        }
        else {
            var url = rootUrl + "Account/ChangePassword";
            var data = {
                oldPassword: $("#currPw").val(),
                newPassword: $("#newPw1").val(),
                reset: "false"
            };
            if (reset) {
                data = { newPassword: $("#newPw1").val(), reset: "true", userId: $("#userIdTxt").val() };
            }
    
            $.ajax({
                url: url,
                data: data,
                success: function (data) {
                    if (data.success != null && data.success == "true") {
                        $("#changeSuccess").css("display", "block");
                        setTimeout(function () { document.location.href = homeUrl; }, 3000);
                    }
                    else {
                        $("#error").css("display", "block");
                        if (data.error != null) {
                            $("#errMsg").html(data.error);
                        }
                    }
                },
                failure: function () {
                    $("#error").css("display", "block");
                },
                type: "POST"
            });
        }
    }
    };
    
    以及脚本调用的控制器:

        /// <summary>
        /// This can be called from the change password page or the reset password page
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult ChangePassword(FormCollection form)
        {
            JsonResult jr;
    
            // ChangePassword will throw an exception rather
            // than return false in certain failure scenarios.
            try
            {
                bool changePasswordSucceeded;
                    MembershipUser currentUser = Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name, true /* userIsOnline */) ??
                        Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name);
                    if (currentUser != null)
                    {
                        try
                        {
                            changePasswordSucceeded = urrentUser.ChangePassword(form["oldPassword"], form["newPassword"]);
                            if (changePasswordSucceeded)
                            {
                                currentUser.IsApproved = true;
                                Membership.UpdateUser(currentUser);
    
                                if (currentUser.ProviderUserKey != null)
                                {
                                    var mxUser = new MxUser(currentUser.ProviderUserKey.ToString());
                                    Session["User"] = mxUser;
                                    jr = Json(new {success = "true"});
                                }
                                else jr = Json(new {success = "false",error = "Cannot find ProviderUserKey."});
    
                            }
                            else jr = Json(new{success = "false",error = "Cannot update the user password."});
                        }
                        catch
                        { jr = Json(new{success = "false",error = "Unexpected error in updating the user password."}); }
                    }
                    else jr = Json(new {success = "false", error = "Cannot find the user"});
            }
            catch (Exception ex)
            { jr = Json(new {success = "false", error = ex.Message}); }
            return jr;
        }
    
    //
    ///这可以从“更改密码”页面或“重置密码”页面调用
    /// 
    /// 
    /// 
    [HttpPost]
    public JsonResult ChangePassword(FormCollection表单)
    {
    JsonResult jr;
    //ChangePassword将引发异常,而不是
    //而不是在某些故障情况下返回false。
    尝试
    {
    bool-changepasswordsuccessed;
    MembershipUser currentUser=Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name,true/*userIsOnline*/)??
    GetUser(System.Web.HttpContext.Current.User.Identity.Name);
    如果(currentUser!=null)
    {
    尝试
    {
    ChangePasswordSuccessed=urrentUser.ChangePassword(表格[“旧密码”]、表格[“新密码”]);
    如果(ChangePasswordSuccessed)
    {
    currentUser.IsApproved=真;
    Membership.UpdateUser(当前用户);
    if(currentUser.ProviderUserKey!=null)
    {
    var mxUser=new mxUser(currentUser.ProviderUserKey.ToString());
    会话[“用户”]=mxUser;
    jr=Json(新的{success=“true”});
    }
    else jr=Json(新的{success=“false”,error=“找不到ProviderUserKey.”);
    }
    else jr=Json(新的{success=“false”,error=“无法更新用户密码。”});
    }
    接住
    {jr=Json(新的{success=“false”,error=“更新用户密码时出现意外错误。”});}
    }
    else jr=Json(新的{success=“false”,error=“找不到用户”});
    }
    捕获(例外情况除外)
    {jr=Json(新的{success=“false”,error=ex.Message});}
    返回jr;
    }
    
    如果没有,他们需要更改什么设置、配置等才能使其工作

    
    
    <system.webServer>     
    

    
    


    添加此配置并确保会话设置具有InProc、SQL或ASP.NET状态服务

    我知道的唯一原因是
    HttpContext。请求期间当前的
    为null是使用
    。在异步操作上配置等待(false)
    。。。由于您的示例是严格同步的,所以不太可能是原因…此行位于哪里
    Membership.GetUser(System.Web.HttpContext.Current.User.Identity.Name)
    ?检查应用程序是否在适当的设置下运行(框架版本、集成模式与经典模式)如果
    System.Web.HttpContext.Current.User.Identity.Name
    为空,则
    System.Web.HttpContext.Current
    不可能为空。应该发生的是,您将获得一个NullReferenceException,因为您正试图取消对null Current的引用以获取用户对象,而这不应允许应用程序继续处理,除非您捕获并接受该异常。至于为什么HttpContext.Current会为null,这取决于许多因素。。比如,这到底发生在哪里?给我们看一些实际的代码。@Stilgar,我们确实验证了框架和模式与其他服务器匹配。
    <remove name="Session"/>     
    <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition=""/>