Путь. GetTempFileName — Имя каталога недопустимо

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

9
задан Douglas Anderson 10 September 2008 в 22:26
поделиться

3 ответа

Это - вероятно, комбинация олицетворения и несоответствие другого появления методов аутентификации.

Существует много частей; я попытаюсь пробежаться через них один за другим.

Олицетворение является техникой, чтобы "временно" переключить учетную запись пользователя, под которой работает поток. По существу поток кратко получает те же права и доступ - ни больше, ни меньше - как учетная запись, которая является олицетворением. Как только поток сделан, создав веб-страницу, он "возвращается" назад в исходную учетную запись и готовится к следующему вызову. Эта техника привыкла к ресурсам доступа, что только пользователь вошел в Ваш веб-сайт, имеет доступ к. Держите на понятие в течение минуты.

Теперь, 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 управляет для Вас. Вторая альтернатива должна спрятать учетную запись и пароль, зашифрованный в реестре. Тот шаг является немного сложным и также идет вне объема этого обсуждения.

Удачи!

18
ответ дан 4 December 2019 в 10:06
поделиться

Можно использовать Путь. GetTempPath () для обнаружения, который каталог, в который это пытается записать.

0
ответ дан 4 December 2019 в 10:06
поделиться

Мог быть то, потому что IIS_WPG не имеет доступа к временной папке. Если Вы думаете, что это - проблема разрешения, выполните Procmon на рабочем процессе asp.net и проверке на ошибки AccessDenied.

2
ответ дан 4 December 2019 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: