У меня есть служба WCF, размещенная в IIS / ASP.NET, которая принимает HTTP Post ( not form 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: ""