数组:"索引超出了数组范围"

4
我在我的Web应用程序中遇到了以下错误:"数组下标超出范围"

奇怪的是,这个问题只出现在我的Web服务器上(Windows Server 2008 R2、.Net 4.0、Windows 7 Enterprise 64位)。当我在Visual Studio中调试站点时,一切都很完美。
代码看起来像这样:
我定义一个数组并将其传递给类"CheckUserRights"。
string NTLogin = Page.User.Identity.Name.ToString().Split(new char[] { '\\' })[1].ToUpper();
string[] allowedRoles = new string[2] { "Administrator", "Superuser" };
CheckUserRights Check = new CheckUserRights(NTLogin, allowedRoles);

这个类看起来像这样:
//Lokale Variablen definieren
string strUserName;
string strRolename;
string[] AllowedRoles;
bool boolAuthorized;

//Im Konstruktor definierte Werte übergeben.
public CheckUserRights(string Username, string[] Roles)
{
    this.strUserName = Username;
    this.AllowedRoles = Roles;
    getRoleForUser();
    checkRights();
}
...
...

我已经搜寻解决方案四个小时了,但我仍然找不到任何答案。我并不是专业人士,这是我第一次使用数组。

是否可能是服务器配置错误导致的?

非常感谢您的帮助。谢谢!

更新

问题已解决,原因是服务器配置有问题。解决方案请参考Steve的回答。


2
你能展示准确的堆栈跟踪吗? - qehgt
1
有没有堆栈跟踪的机会? - KingCronus
1
你在哪里遇到了错误?我无法看到你的代码中对数组的任何访问尝试... - Shai
2
堆栈跟踪将非常有用。错误可能在getRoleForUser或checkRights中。您需要向我们展示代码。 - Richard Schneider
2
在编程中使用英语作为代码的标准做法,特别是由于所有的 .net 框架都是英文的。 - KingCronus
显示剩余11条评论
3个回答

5

这段代码存在许多问题,但是针对问题标题的问题,我认为这一行代码看起来很可疑:

string NTLogin = Page.User.Identity.Name.ToString().Split(new char[] { '\\' })[1].ToUpper();  

如果Page.User.Identity.Name中不包含DOMAIN\USERNAME会发生什么?
可以改写为
string[] nameparts = Page.User.Identity.Name.ToString().Split(new char[] { '\\' });
string NTLogin = (nameparts.Length == 2 ? nameparts[1] : nameparts[0]).ToUpper();
if(NTLogin.Length == 0)
    return;            

为什么这个属性可能会出错?查看此文章

这是一个内网应用程序。每个员工在上网时都应该拥有这些信息。但我会进行检查。谢谢。 - user1221100
嗨,史蒂夫,感谢你的帮助。我现在已经尝试了一些东西,很可能是来自你链接网站的问题。所有的“症状”都匹配。 - user1221100
现在它可以工作了!非常感谢。问题是我必须禁用“匿名身份验证”并启用“Windows身份验证”。现在“NTLogin”数组的值已经有了,它可以工作了:D - user1221100
@user1221100 很高兴能够帮助到您。然而,如果我理解正确,如果启用了“匿名身份验证”,那么Page.User.Identity.Name将为空,从而导致“索引超出边界”错误。好的,问题已得到解决!如果您觉得有用,请接受答案。 - Steve

1

1) 在 getRoleForUser 的第一个 select 中,您的代码容易受到 SQL 注入攻击。建议使用 SqlParameter。

2) 没有堆栈跟踪信息会让确定错误位置变得困难。但是,我认为问题可能在于 SQL 查询返回了空行。所以,每当您执行 r.Read 时,请将其更改为 if (!r.Read()) return;

同样,如果您发布堆栈跟踪信息,我们可以提供更好的帮助。


0

我的解决方法如下:

Dim strname() As String
For indx = 0 To (strname.Length - 1)
    If strname(indx) = "" Then
    Else
        ListBox1.Items.Add(strname(indx))
    End If
Next

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