Tôi có một dịch vụ WCF được lưu trữ trong IIS/ASP.NET chấp nhận HTTP Post (không phải là hình thức đăng) của các đối tượng được tuần tự hóa.Ghi lại dữ liệu POST HTTP thô trong khi ngoại lệ
Nếu khách hàng gửi yêu cầu không đúng định dạng (ví dụ: họ không sắp xếp chính xác đối tượng) Tôi muốn đăng nhập thư được gửi lên.
Chúng tôi đã sử dụng ELMAH để nắm bắt các ngoại lệ chưa được giải quyết, vì vậy chỉ cần đính kèm dữ liệu bài đăng sẽ là tùy chọn dễ dàng nhất.
Tôi có thể nhận HttpContext hiện tại trong một ngoại lệ, tuy nhiên điều này chỉ chứa thông tin Tiêu đề HTTP.
Câu hỏi của tôi là: Có cách nào để chụp cơ thể yêu cầu HTTP POST gốc không? Hoặc, thất bại đó - một cách tốt hơn (không có một proxy ngược) của việc thu thập các đầu vào gây ra lỗi?
Chỉnh sửa: Chỉ cần làm rõ, việc chạy chụp ở mức gói không phải lúc nào cũng thực sự phù hợp. Tôi là một giải pháp mà tôi có thể triển khai cho các máy chủ Sản xuất và sẽ có khách hàng ngoài tầm kiểm soát hoặc khả năng giám sát của chúng tôi.
Chỉnh sửa # 2: Một gợi ý đã được thực hiện để truy cập Request.InputStream - điều này không hoạt động nếu bạn đang cố gắng đọc sau khi WCF đã đọc yêu cầu ngoài luồng.
Một đoạn mã mẫu để xem cách tôi đã thử sử dụng tính năng này ở đây.
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();
Các ouput của log.ToString() là:
request.InputStream.Position = "0" Original Input: ""
Các "sử dụng" với StreamReader sẽ dẫn đến System.Web.Request.InputStream đang được xử lý (có nghĩa là dữ liệu bị mất). – Jeff
Dữ liệu đã bị mất. –