【问题标题】:"Length cannot be less than zero." on a blank line“长度不能小于零。”在空行上
【发布时间】:2011-04-12 10:17:34
【问题描述】:

我不断收到上述错误消息,即使我注释掉发生错误的行。知道是什么原因造成的吗?我试过用测试值重写这些行,但我仍然得到同样的错误。

这在调试模式下完美运行,它只是在部署中出现。

原码:

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

【问题讨论】:

  • 接下来的几行代码会发生什么?我想错误是存在的(堆栈跟踪中的行号有时会有点混乱)。
  • 在此之前,只有几个变量的初始化和using标签的集合,根本没有函数调用。

标签: c# asp.net


【解决方案1】:

如果在字符串中找不到“\”,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>

【讨论】:

  • 非常感谢,我仍然遇到同样的错误,但我认为这可能是我更改的其他设置之一导致同样的问题仍然出现。我将尝试重置所有设置,然后再试一次。
【解决方案2】:

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

要解决此问题,您可以使用这样的代码,当未找到反斜杠时将分配整个 text

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

【讨论】:

    【解决方案3】:
    text.IndexOf("\\")
    

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

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

    试试这个:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多