“Longitud no puede ser menor que cero.” en una línea en blanco

Sigo recibiendo el mensaje de error anterior, incluso si yo comente la línea que se está produciendo el error. Alguna idea de qué podría estar causando esto? He probado a volver a escribir las líneas con los valores de la prueba, pero me sigue apareciendo el mismo error.

Esto funciona perfectamente en modo de depuración, es sólo en la implementación de este vino.

Código Original:

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 

Código de prueba (mismo error):

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 

Aquí está el seguimiento de la pila si ayuda en todo:

[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
Qué pasa en el próximo par de líneas de código? Me imagino que el error está ahí (los números de línea en el seguimiento de la pila puede ser un poco confuso a veces).
Antes de esto, sólo hay inicialización de una serie de variables y una colección de using etiquetas, no hay llamadas de función.

OriginalEl autor Lyise | 2011-04-12

4 respuestas

  1. 15

    text.IndexOf("\\") estará de regreso -1 si no se puede encontrar “\” en la cadena.

    Se pasa -1 a través de la Substring() método, que no es válido.

    La Page.User.Identity.Name devolverá una cadena vacía si el sitio no se ejecuta con la autenticación de windows integrada exclusivamente habilitado en IIS para ese sitio.

    Es probable que los usuarios acceden al sitio web bajo la autenticación anónima.

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

    Para configurar la autenticación de Windows

    • De inicio de Internet Information Services (IIS).
    • Haga clic derecho en la aplicación del directorio virtual y, a continuación, haga clic en Propiedades.
    • Haga clic en la ficha Seguridad de Directorios.
    • En virtud de autenticación y acceso Anónimo de control, haga clic en Editar.
    • Asegúrese de que la casilla de verificación acceso Anónimo no está activada y que la autenticación Integrada de Windows es la única casilla de verificación seleccionada.
    • En la aplicación Web.archivo de configuración o en la máquina a nivel de Web.archivo de configuración, asegúrese de que el modo de autenticación se establece en Windows como se muestra aquí.


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

    Muchas gracias por esto, todavía estoy recibiendo el mismo error, pero creo que puede ser una de las otras opciones que he cambiado que está causando el mismo problema a aparecer todavía. Voy a intentar restablecer todos los valores de configuración y de intentar esto de nuevo.

    OriginalEl autor David Neale

  2. 5
    text.IndexOf("\\")

    Esto devolverá -1 si el índice de los personajes no se encuentra, y tomando una subcadena de caracteres 0 con una longitud de -1 va a tirar ese error.

    Otra advertencia de ASP.net c# es que el parámetro de longitud de una subcomisión de la cadena también no puede ser mayor que la cadena real (ASP Clásico le permite hacer esto).

    Intente esto:

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

    OriginalEl autor Tom Gullen

  3. 5

    La variable text no contiene \\ subcadena así text.IndexOf("\\") devuelve -1, que es de hecho el argumento no válido para Substring.

    Para solucionar este problema, puede utilizar el código que se asigna a toda la text cuando la barra invertida no se encuentra.

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

    OriginalEl autor Shadow Wizard

  4. 1

    Se pasa un número menor que cero, en el Substring llamada. Dudo que su ejemplo de inicialización de la cadena “PRUEBA” tiene el mismo problema…

    OriginalEl autor Adam Houldsworth

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *