2011-12-31 29 views
13

Tôi đang sử dụng Elmah để đăng nhập ngoại lệ. Elmah là tuyệt vời tại các cơ quan yêu cầu đăng nhập nếu yêu cầu là một yêu cầu dựa trên Biểu mẫu (ví dụ: Content-Type: application/x-www-form-urlencoded), nhưng với các yêu cầu dựa trên JSON nơi kiểu nội dung là application/json, cơ quan yêu cầu không được tìm thấy trong các báo cáo lỗi. Bất cứ ai biết nơi tôi có thể tìm thấy cơ thể yêu cầu này để tôi có thể chẩn đoán đúng trường hợp ngoại lệ của tôi?Elmah: Cách lấy nội dung yêu cầu JSON HTTP từ báo cáo lỗi

UPDATE: 2012-01-03

Là một làm rõ về những gì tôi có nghĩa là bởi yêu cầu JSON dựa, đây là một yêu cầu ví dụ liệu HTTP với JSON là cơ quan yêu cầu:

PUT http://mycompany.com/api/v1.0/me HTTP/1.1 
Host: mycompany.com 
Content-Length: 20 
Content-Type: application/json 

{"city":"Vancouver"} 
+0

Những gì bạn làm có nghĩa là với các yêu cầu dựa trên JSON? Họ có nhận được thông qua GET hoặc POST không? Nếu bạn nhập trang chi tiết và nhấp vào "Dữ liệu thô/nguồn trong XML", bạn có thể thấy cơ thể ở đó không? – alexn

+0

@alexn, các yêu cầu được gửi qua PUT và POST. Dữ liệu thô/nguồn trong XML không hiển thị phần thân yêu cầu cho các yêu cầu dựa trên JSON. Vui lòng xem thông tin cập nhật của tôi ở trên để biết rõ ý nghĩa của các yêu cầu dựa trên JSON. –

Trả lời

17

ELMAH cho đến nay chỉ ghi lại ngữ cảnh hoặc thông tin ngoại vi theo yêu cầu và có thể được chụp một cách thuận tiện theo cách tiêu chuẩn. Biểu mẫu được cho là một điều trị đặc biệt vì ASP.NET đã thực hiện công việc giải mã và ghi nhớ các đối tượng yêu cầu khi loại MIME là application/x-www-form-urlencoded. JSON yêu cầu mặt khác là prolematic bởi vì tại thời điểm một ngoại lệ xảy ra, các dòng đầu vào (HttpRequest.InputStream) có thể đã được một phần hoặc hoàn toàn tiêu thụ bởi một bộ giải mã JSON. ELMAH sẽ không thể có được một vết nứt thứ hai vào nó cho mục đích khai thác gỗ. Do đó, bạn sẽ phải đảm bảo rằng bạn đệm luồng đầu vào hoặc văn bản trước khi chuyển nó qua bất kỳ bộ giải mã JSON nào và cất nó đi đâu đó như HttpContext.Items. Sau đó, bạn có thể thử khôi phục dữ liệu đã lưu vào bộ đệm và attach it to an outgoing mail at the time of an error. ELMAH hiện không hỗ trợ đính kèm dữ liệu tùy ý vào lỗi đăng nhập. Tuy nhiên, có ErrorLogModule có sự kiện Logged và cung cấp Id của lỗi đăng nhập. Điều này có thể được sử dụng để lưu trữ dữ liệu đầu vào ở nơi khác (có thể trong bảng khác nếu bạn đang sử dụng cơ sở dữ liệu phía sau cho nhật ký lỗi) nhưng buộc nó trở lại lỗi đăng nhập bằng cách duy trì liên kết thông qua Id.

+0

Cảm ơn Atif cho câu trả lời chi tiết của bạn. Về tùy chọn thư đi (ví dụ: bên trong ErrorMail_Mailing), tôi không có quyền truy cập vào HttpContext, vì vậy tôi không thể truy cập HttpContext.Items. Nếu tôi có thể truy cập HttpContext, thì tôi có thể cố gắng phục hồi phần thân yêu cầu từ HttpRequest.InputStream nếu nó vẫn có sẵn. Có thể truy cập HttpContext từ ErrorMail_Mailing không? –

+0

Bạn nên truy cập vào thuộc tính ['Context'] (http://msdn.microsoft.com/en-us/library/system.web.httpapplication.context.aspx) bên trong trình xử lý sự kiện. Nó được thừa hưởng từ ['HttpApplication'] (http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx) bằng' Global.asax'. Hãy thử 'this.Context' hoặc chỉ cần gõ' this' sau đó là dấu chấm (.) Và nó sẽ hiển thị trong IntelliSense trong IDE. –

+0

this.Context is null và this.Request ném một ngoại lệ vì nó không còn nữa. HttpContext.Hiện tại là null. Dường như ErrorMail_Mailing được gọi sau khi phản hồi được gửi đi. –

1

Ngoài câu trả lời của Atif ở đây, có một cách để add additional details to ELMAH log bằng cách ném thủ công Ngoại lệ mới. Nó không đặc biệt thanh lịch nhưng có vẻ như để làm công việc!

Tôi muốn được quan tâm để nghe bất kỳ ý kiến ​​từ người đàn ông mình ...

+0

Thú vị. Cảm ơn. –

4

đầu tiên cài đặt gói NuGet: Newtonsoft.Json

install-package Newtonsoft.Json 

thì:

public override void OnException(HttpActionExecutedContext filterContext) 
     { 
    var message = new StringBuilder(); 
      foreach (var param in filterContext.ActionContext.ActionArguments) 
      { 
       message.Append(string.Format("{0}:{1}\r\n", param.Key, Newtonsoft.Json.JsonConvert.SerializeObject(param.Value))); 
      } 
      var ex = new Exception(message.ToString(), filterContext.Exception); 
      var context = HttpContext.Current; 
      ErrorLog.GetDefault(context).Log(new Error(ex, context)); 
} 
Các vấn đề liên quan