4

我的 Web 应用程序出现以下错误:“索引超出了数组的范围。”

奇怪的是,问题只出现在我的网络服务器(Windows Server 2008 R2、.Net 4.0、Windows 7 Enterprise 64 Bit)上。

当我在 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();
}
...
...

我在 4 小时后搜索了解决方案,但我找不到任何东西。我不是专业人士,这是我第一次使用数组。

会不会是服务器上的错误配置?

我很感激每一个帮助。谢谢!

更新

解决了,服务器配置有问题。解决方案在史蒂夫的回答中。

4

3 回答 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;            

为什么这个属性可能是错误?看看这篇文章

于 2012-05-08T13:54:36.397 回答
1

1) 您的代码在 getRoleForUser 中的第一个选择上容易受到 SQL 注入攻击。您应该使用 SqlParameter。

2)没有堆栈跟踪,很难确定错误在哪里。但是,我认为 sql 选择可能会返回 NO ROWS。因此,每当您执行 a 时r.Read,将其更改为if (!r.Read()) return;.

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

于 2012-05-08T13:57:42.110 回答
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
于 2012-10-09T04:37:26.583 回答