Да, работает довольно не плохо. Вот только с этими хендлерами попутно еще одна проблемма.
Дето в том что когда запрашиваеться файл и он отдаеться через хендлер, то как при сохранении
указать его оригинальное имя. Тоесть например файл my.mp3 и запрос на него
www.something.com/file.ashx?filename=my.mp3
то когда хендлер вычитает этот файл и отдаст его в респорс, то браузер предложит его сохранить,
но имя файла для сохранения будет file.ashx, а не my.mp3. Как то это можно изменить?
Здравствуйте, rsn81, Вы писали:
R>Взять компонент MimeDetector, в обработчике (System.Web.IHttHandler) выдавать поток бинарного файла пачками, к примеру, по 100 байт так:context.Response.BinaryWrite(bytes);
По первым 100 байтам (на самом деле хватит и меньше; то есть как у вас написано — не делайте, возможны тормоза) определить Content-Type примерно таким кодом:private static string GetContentType(byte[] bytes) {
R> MimeTypes types = (MimeTypes) HttpRuntime.Cache["mimeTypes"];
R> if (types == null) {
R> types = new MimeTypes();
R> HttpRuntime.Cache["mimeTypes"] = types;
R> }
R> sbyte[] data = SupportUtil.ToSByteArray(bytes);
R> MimeType type = types.GetMimeType(data);
R> if (type != null)
R> return type.Name;
R> return string.Empty;
R>}
Стоит это хозяйство кэшировать, иначе при каждом определении MimeDetector будет заново зачитывать свой конфигурационный файл (в нем хранится соответствие Content-Type и заголовка, можно свои типы добавлять, в принципе).
R>PS Прикрутил MimeDetector к своему BinaryHandler-у минут за 30 — работает отлично, жалоб не имею.