Я создаю библиотеку утилит, которые будут использоваться как в среде рабочего стола в веб-среде.
Он содержит несколько функций, которые, как я полагаю, часто повторяются в моих приложениях, включая утилиту, чтобы получить тип mime файла по его содержимому (а не расширение).
Файлы, которые мне нужно проверить, являются наиболее распространенными (jpg, png, pdf, txt), поэтому я решил использовать внешний метод FindMimeFromData
(ссылка выше)
Используя .NET, как вы можете найти тип mime файла на основе имени файла, а не расширения
Метод работает хорошо, за исключением двух неправильных типов mime JPG (image/pjpg
) и PNG (image/x-png
), которые легко решаются путем проверки перед оператором return.
Библиотека скомпилирована для платформы AnyCPU, поскольку она должна быть установлена на серверах/клиентах как на 32, так и на 64 бит.
Во время тестирования среды рабочего стола все работает исправно для обоих приложений, скомпилированных для x86 и x64.
во время тестирования приложения ASP.NET(пустой сайт с обработчиком HTTP для теста) возникает ошибка типа HRESULT, и отладчик сообщает мне, что он не может предоставить дополнительную информацию.
После нескольких тестовых конфигураций, включая изменение идентификатора пула в локальной системе (без результата), я определил проблему:
пул должен разрешить 32-разрядные приложения (см. изображение выше).
Почему?
Не следует загружать dll urlmon.dll
из 64-битной системы, где мы сейчас?
Это большая проблема, потому что метод FindMimeFromData
может быть вызван всюду в эту библиотеку:
результат состоит в том, что вызов этого метода другим методом утилиты может вызвать это исключение и затруднить отслеживание проблемы также путем отладки.
Любые идеи/опыт?
Операционные системы, используемые для тестирования
Desktop:
- Windows 8 x64 - работает
- Windows 7 x64 - работает
- Windows Server 2008 Standard R2 x64 - работает
- Стандарт Windows Server 2008 x86 - работает
- Стандарт Windows Server 2003 x86 - работает
- Windows XP Professional SP3 - работает
Web:
- Windows 8 x64 - обнаружена первая ошибка, работает только с включенным 32-битным приложением.
- Windows Server 2008 Standard R2 x64 - ошибка подтверждена, работает только с включенным 32-битным приложением
- Стандарт Windows Server 2008 x86 - работает
РЕДАКТИРОВАТЬ 2 (вопрос решен)
Решено Noseratio:
Правильный тип параметров ppwzMimeOut
и pBC
должен быть System.IntPtr
вместо System.UInt32
.
Я знаю, что System.UInt32
вызывает проблемы во всех 64-битных веб-приложениях, но я не знаю почему.
Если кто-то знает причину этих проблем, может объяснить это лучше в комментарии?
Заранее спасибо