0

Итак, у меня есть код, выполняющий проверку IP-адресов, чтобы у учетной записи ADMIN не было доступа из-за пределов моей сети.ASP.Net System.ArgumentOutOfRangeException

string strIP = Request.ServerVariables["REMOTE_ADDR"]; 
if (
    (strIP.Substring(0, 9) != "XXX.XX.X.") 
&& (strIP.Substring(0, 10) != "XXX.XX.XX.") 
&& (strIP.Substring(0, 6) != "XX.XX.") 
&& (strIP.Substring(0, 6) != "XX.XX.") 
) 
{ 
..// Check user for being an ADMIN // .... 
} 

Этот код работал нормально в течение нескольких недель, но неожиданно начал последовательно выходить из строя. Сообщение об ошибке:

Исключение

Исключение Тип: System. ArgumentOUtOfRangeException

Сообщение об исключении: указатель и длина должны относиться к местоположению внутри строки. Имя параметра: длина.

Когда я удаляю линию с помощью «Подстроки (0,10)», все работает. Кроме того, когда я меняю строку «Подстрока (0,10)» на «Подстрока (0,9)» и удаляю последнюю «.», Все работает.

Может ли кто-нибудь сказать мне, почему или, возможно, проинструктировать о том, что делается неправильно? Для жизни я не могу понять, что происходит.

+0

Какова длина полосы? Если оно меньше 10, ожидается, что strIP.Substring (0, 10) будет исключаться. –

ответ

1

проблема заключается в тха t strIP не имеет 10 символов, потому что по какой-то причине ваша конфигурация изменилась. Вы могли бы сделать что-то вроде:

(strIP.Length >= 9 && strIP.Substring(0, 9) != "XXX.XX.X.") 
|| (strIP.Length >= 10 && strIP.Substring(0, 10) != "XXX.XX.XX.") 
|| (strIP.Length >= 6 && strIP.Substring(0, 6) != "XX.XX.") 

Обратите внимание, что четвертая строка была дубликатом третьего.

+0

Кажется правдоподобным капитаном. Я отчитаю, если это решит проблему! –

+0

@AnalyticLunatic - не сказать, что этот ответ неверен, но я чувствую, что оператор switch в моем ответе более читабельен и более удобен в обслуживании, но использует все, что работает и чувствует к нему право. :-) –

+0

@ KarlAnderson, я ценю ваш вклад :) Для чего-то такого маленького оператора Switch, по моему предпочтению, будет немного выше вершины. У Musical_coder была самая простая идея реализовать в случае, если мы когда-нибудь включим другие IP-адреса в критерии для проверки. –

0

Не позволяют из оценки точности произойдет, поставив галочку на длину strIP, прежде чем пытаться делать какие-либо из суб-сравнения строк, например:

if (strIP.Length == 10) 
{ 
    if ((strIP.Substring(0, 9) != "XXX.XX.X.") 
     && (strIP.Substring(0, 10) != "XXX.XX.XX.") 
     && (strIP.Substring(0, 6) != "XX.XX.") 
     && (strIP.Substring(0, 6) != "XX.XX.")) 
    { 
     ..// Check user for being an ADMIN // .... 
    } 
} 
else 
{ 
    // Do something here, error, message to user, deny access, etc. 
} 

UPDATE:

Если вы хотите применить только проверки, на основании длины строки, а затем использовать switch заявление, например:

switch (strIP.Length) 
{ 
    case 6: 
     if(strIP.Substring(0, 6) != "XX.XX.") 
     { 
      // Check user for being an ADMIN 
     } 
     break; 
    case 9: 
     if(strIP.Substring(0, 9) != "XXX.XX.X.") 
     { 
      // Check user for being an ADMIN 
     } 
     break; 
    case 10: 
     if(strIP.Substring(0, 10) != "XXX.XX.XX.") 
     { 
      // Check user for being an ADMIN 
     } 
     break; 
    default: 
     // IP string is not in format expected, do something here 
     // Most likely would want to err on the side of caution and deny access 
     break; 
} 
+0

Это заблокировало бы весь чек, если строка не будет точно равна 10 символам, что, похоже, не всегда так. –

+0

@musical_coder - ну тогда вы не можете И ('&&') вместе со своими условиями. Я отошел от логики, которую вы предоставили. –

+0

@KarlAnderson - я получаю IP-адрес, а затем проверяю, чтобы определенные подстроки возвращаемого IP-адреса не соответствовали моим заданным критериям (предотвращение входа в ADMIN из внешних местоположений). У меня нет способа узнать, что возвращенная строка IP будет равна 10 или любой фигуре. Я полагаю, что если возвращаемый IP-адрес меньше 10, это приведет к тому, что указанная выше строка выведет ошибку, но как мне обойти эту проблему? –

Смежные вопросы