Модули предназначены для обработки событий, вызванных приложением, до и после того, как запрос фактически обработан обработчиком. С другой стороны, обработчикам не предоставляется возможность подписаться на какие-либо события приложения, и вместо этого просто вызывается их метод ProcessRequest для выполнения «основной» работы по обработке конкретного запроса.
Посмотрите на эту документацию от Microsoft (примерно на полпути вниз по странице в разделе «Запрос обрабатывается конвейером HttpApplication»):
http://msdn.microsoft.com/en-us/library/bb470252.aspx
На шаге 15 вы можете увидеть, где обработчик получает возможность выполнить. Все события до и после этого шага доступны для перехвата модулями, но не обработчиками.
В зависимости от того, какие конкретные функции вы пытаетесь достичь, вы можете использовать либо обработчик, либо модуль для реализации обработчика загрузки. Вы можете даже использовать оба.
Что-то, что следует учитывать, может использовать обработчик загрузки, который уже написан.
Вот бесплатный и открытый исходный код:
http://www.brettle.com/neatupload
Вот коммерческий:
http://krystalware.com/Products/SlickUpload/
Если вы посмотрите документацию для NeatUpload, то увидите, что для этого требуется настроить модуль.