Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это - вероятно, комбинация олицетворения и несоответствие другого появления методов аутентификации.
Существует много частей; я попытаюсь пробежаться через них один за другим.
Олицетворение является техникой, чтобы "временно" переключить учетную запись пользователя, под которой работает поток. По существу поток кратко получает те же права и доступ - ни больше, ни меньше - как учетная запись, которая является олицетворением. Как только поток сделан, создав веб-страницу, он "возвращается" назад в исходную учетную запись и готовится к следующему вызову. Эта техника привыкла к ресурсам доступа, что только пользователь вошел в Ваш веб-сайт, имеет доступ к. Держите на понятие в течение минуты.
Теперь, ASP.NET по умолчанию выполняет веб-сайт в соответствии с локальной учетной записью под названием ASPNET. Снова, по умолчанию, только учетная запись ASPNET и члены Группы администраторов могут записать в ту папку. Ваша временная папка находится под областью той учетной записи. Это - вторая часть загадки.
Олицетворения не происходит самостоятельно. Это должно быть, включают намеренно в Вашем web.config.
<identity impersonate="true" />
Если установка будет отсутствовать или набор ко лжи, то Ваш код выполнится чистый и просто в соответствии с упомянутой выше учетной записью ASPNET. Учитывая Ваше сообщение об ошибке, я положителен, что у Вас есть impersonation=true. Нет ничего неправильно с этим! Олицетворение имеет преимущества и недостатки, которые идут вне этого обсуждения.
Существует один оставленный вопрос: когда Вы используете олицетворение, какая учетная запись явлена олицетворением?
Если Вы не указываете учетную запись в web.config (полный синтаксис нейтрального элемента здесь), учетная запись явилась олицетворением, тот, который IIS передал ASP.NET. И это зависит от того, как пользователь прошел проверку подлинности (или не) в сайт. Это - Ваша третья и заключительная часть.
Учетная запись IUSR_ComputerName является учетной записью низких прав, созданной IIS. По умолчанию эта учетная запись является учетной записью, в соответствии с которой работает веб-вызов, если пользователь не мог бы аутентифицироваться. Таким образом, пользователь входит как "анонимное".
Таким образом, это - то, что происходит с Вами:
Ваш пользователь пытается получить доступ к веб-сайту, и IIS не мог аутентифицировать человека по некоторым причинам. Поскольку Анонимный доступ идет, (или Вы не видели бы, что IUSRComputerName получает доступ к временной папке), IIS позволяет пользователю войти так или иначе, но как основной пользователь. Ваш код ASP.NET выполняет и является олицетворением этой универсальной "гостевой" IUSR ___ ComputerName учетной записи; только теперь код не имеет доступа к вещам, что учетная запись ASPNET имела доступ к, включая его собственную временную папку.
Предоставление Доступа для записи IUSR_ComputerName к папке заставляет Ваши признаки уйти.
Но это просто признаки. Необходимо ли рассмотреть, почему человек стал "Анонимным / Гость"?
Существует два вероятных сценария:
a) Вы намеревались использовать IIS для аутентификации, но настройки аутентификации в IIS для некоторых Ваших серверов являются неправильными.
В этом случае необходимо отключить Анонимный доступ на тех серверах так, чтобы обычные механизмы аутентификации произошли. Обратите внимание, что Вы, возможно, все еще должны были бы предоставить своему пользовательскому доступу к той временной папке или использовать другую папку вместо этого, одну, к которой у Ваших пользователей уже есть доступ.
Я много раз работал с этим сценарием, и вполне откровенно он дает Вам меньше головных болей для воздержания от папки Temp; создайте специализированную папку в сервере, установите верные полномочия и установите его местоположение в web.config.
b) Вы не хотели аутентифицировать людей так или иначе, или Вы хотели использовать Аутентификацию Форм ASP.NET (который использует Анонимный доступ IIS для обхода регистраций IIS и позволяет ASP.NET обработать аутентификацию непосредственно),
Этот случай немного более сложен.
Необходимо перейти к IIS и отключить все формы аутентификации кроме "Анонимного Доступа". Обратите внимание, что Вы не можете сделать этого в поле разработчика, потому что отладчику нужна Интегрированная Аутентификация, которая будет включена. Таким образом, Ваша отладка поля будет вести себя немного отличающаяся, чем реальный сервер; просто знайте об этом.
Затем необходимо решить, необходимо ли выключить олицетворение, или с другой стороны, для определения учетной записи для исполнения роли в web.config. Сделайте первое, если Вашему веб-серверу не нужны внешние ресурсы (как база данных). Сделайте последнего, если Ваш веб-сайт действительно должен работать в соответствии с учетной записью, которая имеет доступ к базе данных (или некоторый другой внешний ресурс).
У Вас есть еще две альтернативы для определения учетной записи для исполнения роли. Один, Вы могли перейти к IIS и изменить "анонимную" учетную запись, чтобы быть один с доступом к ресурсу вместо того, которым IIS управляет для Вас. Вторая альтернатива должна спрятать учетную запись и пароль, зашифрованный в реестре. Тот шаг является немного сложным и также идет вне объема этого обсуждения.
Удачи!
Можно использовать Путь. GetTempPath () для обнаружения, который каталог, в который это пытается записать.
Мог быть то, потому что IIS_WPG не имеет доступа к временной папке. Если Вы думаете, что это - проблема разрешения, выполните Procmon на рабочем процессе asp.net и проверке на ошибки AccessDenied.