У меня есть служба WCF, размещенная в IIS/ASP.NET, которая принимает HTTP-сообщение (не формирует сообщение) сериализованных объектов.Захват необработанных HTTP-данных POST во время исключения
Если клиент отправляет неверные запросы (например, они не сериализуют объект правильно), я хотел бы зарегистрировать отправленное сообщение.
Мы уже используем ELMAH для захвата необработанных исключений, поэтому простое размещение данных будет самым простым.
Я могу получить текущий HttpContext во время исключения, однако это содержит только информацию заголовка HTTP.
Мой вопрос заключается в следующем: есть ли способ захвата исходного запроса HTTP POST? Или, если это не так - лучший способ (без обратного прокси) захвата ввода, вызвавшего ошибку?
Редактировать: Просто уточнить, запуск захвата на уровне пакетов в любое время не подходит. Я после решения, которое я могу развернуть на серверах производства, и которые будут иметь клиентов вне нашего контроля или возможности мониторинга.
Редактировать # 2: Было предложено получить доступ к Request.InputStream - это не работает, если вы пытаетесь прочитать после того, как WCF прочитал запрос от потока.
Образец кода, чтобы увидеть, как я пытался использовать это здесь.
StringBuilder log = new StringBuilder();
var request = HttpContext.Current.Request;
if (request.InputStream != null)
{
log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
if (request.InputStream.Position != 0)
{
request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}
using (StreamReader sr = new StreamReader(request.InputStream))
{
log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
}
}
else
{
log.AppendLine("request.Inputstream = null");
}
log.ToString();
вывод из log.ToString() является:
request.InputStream.Position = "0" Original Input: ""
"Использование" с StreamReader приведет к System.Web.Request.InputStream находится (что означает, что данные теряются). – Jeff
Данные уже потеряны. – 2009-05-26 00:57:16