“长度不能小于零。”在一条空白的线上

时间:2011-04-12 10:17:35

标签: c# asp.net

我一直收到上述错误消息,即使我注释掉了发生错误的行。知道是什么原因引起的吗?我尝试用测试值重写行,但我仍然得到同样的错误。

这在调试模式下非常有效,只有部署才会出现。

原始代码:

Line 21:             string domain, username;
Line 22:             string text = Page.User.Identity.Name;
Line 23: 
Line 24:             domain = text.Substring(0, text.IndexOf("\\"));
Line 25:             username = text.Substring(text.IndexOf("\\") + 1, text.Length - text.IndexOf("\\") - 1);

Source File: F:\<file path>\Default.aspx.cs    Line: 23 

测试代码(相同的错误):

Line 21:             string domain, username;
Line 22:             //string text = "TEST"; // Page.User.Identity.Name;
Line 23:             // this line is blank
Line 24:             domain = "TEST"; //text.Substring(0, text.IndexOf("\\"));
Line 25:             username = "TEST"; // text.Substring(text.IndexOf("\\") + 1,

Source File: F:\<file path>\Default.aspx.cs    Line: 23 

如果它有帮助,这是堆栈跟踪:

[ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length]
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +12681546
Insufficiencies._Default.Page_Load(Object sender, EventArgs e) in F:\<file path>\Default.aspx.cs:23
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3048

4 个答案:

答案 0 :(得分:15)

如果

text.IndexOf("\\")在字符串中找不到“\”,则会返回-1

您正在将-1传递给Substring()方法,该方法无效。

如果站点未运行,并且IIS中为该站点专门启用了Windows集成身份验证,则Page.User.Identity.Name将返回一个空字符串。

用户可能会以匿名身份验证访问该网站。

来自http://msdn.microsoft.com/en-us/library/ff647405.aspx

配置Windows身份验证

  • 启动Internet信息服务(IIS)。
  • 右键单击应用程序的虚拟目录,然后单击“属性”。
  • 单击“目录安全性”选项卡。
  • 在“匿名访问和身份验证控制”下,单击“编辑”。
  • 确保未选中“匿名访问”复选框,并且“集成Windows身份验证”是唯一选中的复选框。
  • 在应用程序的Web.config文件或机器级Web.config文件中,确保将身份验证模式设置为Windows,如下所示。

<system.web> ... <authentication mode="Windows"/> ... </system.web>

答案 1 :(得分:6)

变量text不包含\\子字符串,因此text.IndexOf("\\")返回-1,这确实是Substring的无效参数。

要解决此问题,您可以使用在找不到反斜杠时分配整个text的代码。

int backSlashIndex = text.IndexOf("\\");
domain = (backSlashIndex >= 0) ? text.Substring(0, backSlashIndex) : text;

答案 2 :(得分:5)

text.IndexOf("\\")

如果找不到字符的索引,则返回-1,并且从长度为0的字符-1中获取子字符串将抛出该错误。

ASP.net c#的另一个警告是子字符串的长度参数也不能大于实际字符串(Classic ASP允许你这样做)。

试试这个:

int SlashPos = text.IndexOf("\\");
if(SlashPos > 0)
    domain = text.Substring(0, SlashPos);
else
    domain = text;

答案 3 :(得分:1)

您正在将小于零的数字传递到Substring来电。我怀疑你将字符串初始化为“TEST”的例子有同样的问题......