metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-05-05 07:39 am

А теперь про индуизм, то есть дотнет.

Второй день занимаюсь тем, что ребе [livejournal.com profile] theiced называет "ежики, кактус".

Дано: есть RESTful веб-сервис на дотнете, состоит из нескольких HttpHandler-ов (ну это в дотнете сервлеты так называются). И один из этих хендлеров служил для закачки файлов. Файлов немелкого размера, до 100-200 мб.
Есть клиент (либа для работы с сервером и использующая ее прогу), который эти файлы должен закачивать.

Данные посылаются в POST запросе. Т.е. я создаю HttpWebRequest, получаю GetRequestStream и в этот Stream пишу данные файла. И это дело тупо виснет при вызове GetResponse.
Не виснет, если:
1) До записи в поток указать ContentLength.
2) Если полученный Stream запилить внутрь StreamWriter и писать в этот самый Writer. При этом в хидерах все равно появляется ContentLength

Первое хоть и извращение, но как-то понятно - видимо, не зная размера данных, что-то там внутри этот класс не может сделать.
А вот второе это какая-то малопонятная индусятина вообще - в StreamWriter передается базовый класс Stream, что при этом с этим Stream можно такого сделать (и как вообще такое можно делать?), что запись в него влияет на появление ContentLength в третьем классе. Т.е. это такой невменяемый побочный эффект, причем почему и как - без исходников не поймешь.
Хоть ты блин сделай какой Stream прокси с записью вызовов в лог и всунуть его между Stream и StreamWriter и посмотреть что за методы там дергаются.

[identity profile] w00dy.livejournal.com 2010-05-05 07:54 am (UTC)(link)
вы RequestStream закрываете перед вызовом GetResponse?
wizzard: (Default)

[personal profile] wizzard 2010-05-05 08:12 am (UTC)(link)
+1

[identity profile] metaclass.livejournal.com 2010-05-05 08:13 am (UTC)(link)
БЛЯ! Перед! Я его закрываю после :)

[identity profile] w00dy.livejournal.com 2010-05-05 08:15 am (UTC)(link)
хехе, ну так логично. Причём это вроде как даже в msdn описано, или в гугле в первых ссылках. Сами с таким некоторое время назад столкнулись.

[identity profile] metaclass.livejournal.com 2010-05-05 08:50 am (UTC)(link)
Описано. Но я не сообразил что там акцент на "закрывать перед".

[identity profile] eoai.livejournal.com 2010-05-06 07:53 am (UTC)(link)
Так оно обычно и бывает. Сначала рефлектором и какой-то матерью заставляешь работать, а потом находишь строчку мелким шрифтом в мсдн. Опыт, как всегда, появляется сразу после того, как очень был нужен.

[identity profile] komarov.livejournal.com 2010-05-05 10:49 am (UTC)(link)
ёжики навалились и сожрали-таки кактус подчистую :-))

[identity profile] slonopotamus.livejournal.com 2010-05-05 03:50 pm (UTC)(link)
> ... сделай какой Stream прокси с записью вызовов в лог и всунуть его ...

А отладчиком посмотреть не?

[identity profile] metaclass.livejournal.com 2010-05-05 03:53 pm (UTC)(link)
2005 студия, внутрь библиотечных вызовов отладчиком ходить не умеет.

[identity profile] slonopotamus.livejournal.com 2010-05-05 06:15 pm (UTC)(link)
Ежики, кактус :) Как так жить-то?