#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 завершается здесь без отображения какого-либо исключения.