Немного странное название, но вот сделка. Для веб-сайта, над которым я работаю, нам нужно генерировать квази-3D изображения на лету. В основном, это для художественного сайта, и нам нужно показать 3D-представление Canvas с двухмерным изображением (jpg). (См. здесь для некоторого контекста.) Наш подход заключается в том, чтобы использовать API-интерфейс WPF 3D и создать Viewport3D в коде, добавить к нему несколько точек с правильными размерами и затем применить текстуры из оригинального JPG соответственно.
Во время тестирования я все время тестировал его в среде песочницы и на встроенном веб-сервере Cassini в Visual Studio. При попытке перенести его в реальное хранилище кода и проверить его там он перестал работать. Выкачанное изображение имеет правильный размер, но оно полностью пустое. Это абсолютно черное. После нескольких часов удара головой о стену я понял, что это проблема IIS.
Я создал простой пример приложения, чтобы продемонстрировать проблему (не добавляет изображения, хотя он просто окрашивает все стороны в зеленый цвет), однако, поскольку большая часть кода в значительной степени не имеет отношения к вопросу, я не буду его здесь ставить, скорее Выложу ссылку на него:
http://www.box.net/shared/55bznpfns1
Если вы загрузите его и захотите запустить, в коде Default.aspx вы увидите это:
protected void buttonClick(object sender, EventArgs e)
{
var path = @"C:\test\output\output.png";
IISvsCassini.WpfImageCreator.CreateWPFImage(path);
}
Не стесняйтесь сменить этот путь на любой другой и убедитесь, что установлены правильные разрешения, так как он попытается сохранить файл там.
Если вы попробуете этот пример в Visual Studio с Cassini, он будет работать нормально, и у вас должен быть новый файл с именем «output.png», который имеет зеленый 3D-куб. Если вы попробуете это в IIS, вы получите пустое изображение.
Несколько замечаний: прежде чем кто-либо спросит, да, я дал всем нужным папкам правильные разрешения. Я также делаю фактическое создание 3D и сохранение изображения в отдельном потоке с состоянием квартиры, установленным в STA.
Я знаю, что это немного необычный случай слияния WPF и ASP.Net, но у кого-то есть какие-нибудь идеи? Есть ли какие-то настройки в IIS, которые мне нужно изменить? Есть ли какое-то ограничение на API-интерфейс WPF, которое не позволяет запускать его из IIS?