我处境有点棘手。我正在使用JavaScript的PageMethod功能,我正在调用一个像gem一样工作的PageMethod。但是我在访问HttpContext的状态时遇到了问题,该状态为我返回值“SYSTEM”
HttpContext.Current.User.Identity.Name
这不是实际的当前用户名。
我知道有几个选项,比如在Session中存储HttpContext.Current或在其他一些自定义容器中保存Context的状态但是给定一个Web场环境我假设这不会按预期工作。
以下是我正在处理的代码
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中工作......:)
所以我想知道是否有办法在不使用会话的情况下访问页面方法中的当前实际用户。
任何帮助都将深受赞赏。
NiK ......
答案 0 :(得分:0)
经过一番阅读后,我想我正在尝试做一些关于页面方法如何工作的不正确的事情。当您的应用程序的身份验证系统基于Windows时,它变得非常棘手,当您从JavaScript调用时,这些页面方法不会导致回发并且不会调用HttpModule。相反,它只是调用该页面方法。
仅供参考,我们有自己的自定义HTTPModule来处理安全性。这甚至在任何其他HttpModule发生之前,并且在调用页面方法时没有调用它,因为我们没有进行回发甚至是部分回发(所以整个缺少HTTPPost的“利基”)。此外,我们得出的结论是,我们在没有任何身份验证的情况下进行服务调用,这对我们来说可能是一个很大的安全问题。
最重要的是它是一个糟糕的设计,很好地说我想提到我们提出的解决方案/解决方法,这就是我们所做的。所以,我们唯一的选择是做一个回发,保持UI活着,我们想要异步更新标签的消息,我们通过使用Sys.Application.add_init进行黑客攻击来实现它。
<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方法。基于这个解决方案,如果有人认为我在这里遗漏了某些东西,或者认为还有其他方法可以做到这一点,那么请根据你的建议更新这篇文章。