«Длина не может быть меньше нуля». в пустой строке

#c# #asp.net

#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
  

Комментарии:

1. Что происходит в следующих нескольких строках кода? Я полагаю, что ошибка здесь (номера строк в трассировках стека иногда могут немного сбивать с толку).

2. До этого была только инициализация нескольких переменных и набора using тегов, никаких вызовов функций вообще.

Ответ №1:

text.IndexOf("\") будет возвращен, -1 если не удается найти «» в строке.

Вы переходите -1 к Substring() методу, который недействителен.

Page.User.Identity.Name Вернет пустую строку, если сайт не запущен с встроенной аутентификацией Windows, включенной исключительно в IIS для этого сайта.

Пользователи, скорее всего, будут заходить на сайт под анонимной аутентификацией.

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

Для настройки проверки подлинности Windows

  • Запустите информационные службы Интернета (IIS).
  • Щелкните правой кнопкой мыши виртуальный каталог вашего приложения, а затем выберите Свойства.
  • Перейдите на вкладку Безопасность каталога.
  • В разделе Управление анонимным доступом и аутентификацией нажмите Редактировать.
  • Убедитесь, что флажок Анонимный доступ не установлен и что встроенная проверка подлинности Windows является единственным установленным флажком.
  • В файле Web.config вашего приложения или в файле Web.config машинного уровня убедитесь, что для режима аутентификации установлен Windows, как показано здесь.
 <system.web>
 ...
   <authentication mode="Windows"/>
 ...
 </system.web>
  

Комментарии:

1. Большое спасибо за это, я все еще получаю ту же ошибку, но я думаю, что это может быть одна из других настроек, которые я изменил, из-за чего все еще появляется та же проблема. Я собираюсь попробовать сбросить все настройки и повторить попытку.

Ответ №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» имеет ту же проблему…

Ответ №5:

Пожалуйста, просмотрите фрагмент кода ниже:

             string newString = "10,20,...";
            index1 = 0;
            string fragment = " ";
           
            while (newString.Contains(",") == true)
            {
                index1 = newString.IndexOf(",");
                fragment = newString.Substring(0, index1);
                MessageBox.Show("fragment:"   fragment);
                newString = newString.Substring(index1   1);
                MessageBox.Show("newString:"   newString);
            }
  

Мы можем использовать «строку.Содержит» функцию и добавьте тег к строке. Добавление тега также может быть выполнено с помощью кода.
Вывод, помещенный:

«фрагмент: 10 Новая строка: 20,…. фрагмент: 20; Новая строка:….»

Цикл while завершается здесь без отображения какого-либо исключения.