0


我的情况有点棘手。我正在使用 JavaScript 的 PageMethod 功能,其中我正在调用一个像 gem 一样工作的 PageMethod。但是,我在访问 HttpContext 的状态时遇到问题,该状态返回值“SYSTEM”

HttpContext.Current.User.Identity.Name

这不是实际的当前用户名。

我知道有几个选项,例如将 HttpContext.Current 存储在 Session 中或将 Context 的状态保存在其他一些自定义容器中,但鉴于网络农场环境,我假设这不会按预期工作。

这是我正在使用的代码

function MyFunction(){
    PageMethod.MyPageMethod();
}

这是服务器方法的签名

    [System.Web.Services.WebMethod()]
    public static void MyPageMethod()
    {
       // gives me "SYSTEM"
       var user = HttpContext.Current.User.Identity.Name;
    }   

此外,如果我使用上面的代码在页面的 OnLoad 事件中访问用户名,那么它可以正常工作并返回 CurrentUserName。

我试图让上面的代码在 ASP.NET Webform 中工作...... :)

所以我想知道是否有一种方法可以在不使用会话的情况下访问页面方法中的当前实际用户。

任何帮助将不胜感激。

尼克...

4

1 回答 1

0

经过相当多的阅读后,我想我正在尝试做一些关于页面方法如何工作的不正确的事情。当您的应用程序的身份验证系统是基于 Windows 的并且当您从 JavaScript 调用时这些页面方法不会导致回发并且不会调用 HttpModules 时,这会变得非常棘手。相反,它只是调用该页面方法。

仅供参考,我们有自己的自定义 HTTPModule 来处理安全性。这甚至在任何其他 HttpModule 发生之前,并且在调用页面方法时没有被调用,因为我们没有进行回发甚至部分回发(所以整个“利基”的 HTTPPost 丢失)。此外,这导致我们在没有任何身份验证的情况下进行服务调用的结论,这对我们来说可能是一个很大的安全问题。

最重要的是这是一个糟糕的设计,我想说我想提一下我们提出的解决方案/解决方法,这就是我们所做的。因此,我们唯一的选择是进行回发以保持 UI 处于活动状态,并且我们希望异步更新标签的消息,我们通过使用 Sys.Application.add_init 进行 hack 来实现它。

<script language="javascript" type="text/javascript" >
    Sys.Application.add_init(function() {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
    });  

      function beginProcess() {           
        processCurrentItem();
    }

       var currentItem = 0;
      function processCurrentItem() {
         if (currentItem < 5) {
            currentItem = currentItem + 1;
            __doPostBack('updatePanel', currentItem);                
        }
    }
     function endRequest() {
       processCurrentItem();
    }
    </script>

我们使用的标记非常简单,在更新面板中有一个标签和一个调用“beginProcess()”函数的按钮。最后在 OnLoad 中,我们有了以下代码

protected override void OnLoad(EventArgs e)
    {
        if (this.IsPostBack)
        {               
           this.lblLabel.Text = "text you may wanna update with";
           // Call the Method you may wanna call 
           // also you may use Request["__EVENTARGUMENT"] to know who caused the 
           // postback and Request["__EVENTTARGET"] to access the argument you may 
           // have passed in. 
        }            
    }

而且这个解决方案不再使用 JavaScript Page 方法。基于这个解决方案,如果有人认为我在这里遗漏了一些东西,或者认为还有其他方法可以做到这一点,那么请用你的建议更新这篇文章。

  • 尼克
于 2011-01-12T19:18:53.980 回答