2008-12-04 10 views
9

У нас есть HttpHandler, который напрямую связан с двоичными сообщениями по HTTP из пользовательского клиентского программного обеспечения. Клиентское программное обеспечение иногда отправляет данные, которые приводят к тому, что IIS 7 отвечает 400 - Bad Request. Поскольку «400 Bad Request» является особым в том, что HTTP.SYS прозрачно обрабатывает его в режиме ядра без уведомления пользовательского режима, никаких ошибок не возникает, чтобы обрабатывать ASP.NET. Можно ли поймать этот http 400 в ASP.NET, чтобы я мог писать конкретные данные в поток Response в этих сценариях? Переадресация на другую страницу не является вариантом, поскольку она должна находиться в текущем запросе/ответе.Может ли ASP.NET HttpHandler обрабатывать HTTP 400 - Bad Request?

+1

Если бы этот вопрос был «помещен в ваши любимые HTTP.SYS и http 400 шутки здесь», на него ответит как минимум 238 респондентов. – cfeduke 2008-12-04 22:40:43

+0

Вы работаете в интегрированном режиме конвейера IIS7 или в классическом режиме? Я не уверен, но вы * можете * увидеть ошибку при использовании интегрированного режима, поскольку «все» проходит через конвейер ASP.NET. В классическом режиме я думаю, что вы SOL. Но я не уверен. – 2008-12-06 21:35:31

ответ

2

Если вы знаете, что вызывает 400, то вы можете быть в состоянии настроить поведение http.sys через реестр, чтобы иметь дело с этим:

http://support.microsoft.com/kb/820129

Однако, следует иметь в виду, что существуют потенциальные последствия для безопасности и производительности.

Другим вариантом было бы использовать прокси-сервер фильтрации перед IIS, тем самым фиксируя запрос до его дальнейшего использования.

+0

Ошибка из недопустимого заголовка длины содержимого, который согласно этому: http://technet.microsoft.com/en-us/library/cc786188.aspx не может быть изменен. Похоже, что это может быть невозможно, даже если вы на самом деле не написали свой собственный http-сервер. – duckworth 2008-12-05 12:41:42

1

Если ваш пользовательский клиент заставляет IIS запускать HTTP 400, он, вероятно, ошибочен и не отправляет действительные HTTP-запросы в соответствии со стандартом. Если вы можете изменить клиента, это было бы правильно. В противном случае вы работаете не с HTTP, а IIS предназначен для обработки HTTP-запросов. Поэтому вы должны запустить собственный сервер для своего собственного протокола (который является нестандартной HTTP-функцией).

Не рекомендуется использовать IIS/ASP.NET для обработки такого запроса, поскольку это может привести к возникновению каких-то странных неожиданных вещей.

2

Я бы попросил их исправить клиентское программное обеспечение. Дайте им отчет, показывающий неудавшиеся запросы. Если вы в состоянии, запустите сниффера, такого как Wireshark, и отправьте им пакеты, если они не верят, что проблема связана с их программным обеспечением.