2014-04-24 18 views
25

Tôi có webapi chạy trên máy chủ IIS7.5. Nó có 3 bộ điều khiển và tất cả 3 bộ điều khiển có thể được sử dụng để truy cập webapi từ các cuộc gọi trong ứng dụng của tôi.Thông báo ngoại lệ HTTPError không hiển thị khi webapi được chạy trên Máy chủ và đang chạy cục bộ

Tôi gặp lỗi khi lớp cơ sở của tôi cho bộ điều khiển của tôi hiển thị các chức năng của nó dưới dạng công khai, thay vì được bảo vệ. Điều này làm cho máy chủ ném một lỗi máy chủ nội bộ 500 (vì một ngoại lệ không hợp lệ được ném "Nhiều hành động được tìm thấy phù hợp với yêu cầu"). Tôi đã mất một thời gian để tìm hiểu về điều này, bởi vì nó không bao giờ kích hoạt đăng nhập từ webapi của tôi. Từ dicussion here, tôi phát hiện ra rằng lỗi xảy ra đã xảy ra trước khi một hàm Application_Error bắt nó để ghi lại nó. Vì vậy, tôi đã thêm mã bên dưới vào global.asax của webapi của tôi và giờ đây tôi có thể ghi lại các lỗi như thế này. NHƯNG, vấn đề của tôi bây giờ, khi tôi gây ra Lỗi Máy chủ Nội bộ 500 giống như trên, trên máy cục bộ của tôi chạy webapi của tôi, tôi nhận được nhật ký chính xác cách tôi muốn xem nó bằng "ExceptionMessage" của "Nhiều hành động đã được tìm thấy phù hợp với yêu cầu "đánh vần là lý do cho Lỗi Máy chủ Nội bộ. Nhưng khi triển khai mã chính xác này cho máy chủ và sử dụng webapi từ đó, nhật ký của tôi chỉ hiển thị "Thông báo": "Đã xảy ra lỗi" và không hiển thị cho tôi "ExceptionMessage", mặc dù tôi có thể thấy rằng ngoại lệ bị ném bằng PerfView. Tôi chỉ cần có thể lấy nhật ký máy chủ của mình để hiển thị thông tin giống như thông tin nhật ký cục bộ của tôi hiển thị.

public class ResponseExceptionTrapper : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     return base 
      .SendAsync(request, cancellationToken) 
      .ContinueWith(response => 
      { 
       var result = response.Result; 
       if (!result.IsSuccessStatusCode) 
       { 
        var exceptionResult = string.Format(
         "Response exception: \r\n Path({0}) \r\n Status({1}) \r\n", 
         request.RequestUri, 
         result.StatusCode); 

        if (result.Content != null) 
        { 
         var exceptionReadTask = 
           result.Content.ReadAsStringAsync(); 

         exceptionReadTask.Wait(); 
         exceptionResult += "Message:" + 
              exceptionReadTask.Result; 

        } 

        // Do something appropriate with exceptionResult 
        exceptionResult.Log(); 
       } 

       return result; 
      }, cancellationToken); 
    } 
} 

server Log Ví dụ:

Timestamp: 4/24/2014 12:24:40 PM 
Message: Timestamp: 4/24/2014 4:24:40 PM 
Message: Response exception: 
Path(http://webserver/CreditReporting/Api/RetrieveQueuedPullCreditReport) 
Status(InternalServerError) 
Message:{"Message":"An error has occurred."} 

địa phương Log Ví dụ:

Timestamp: 4/24/2014 12:03:16 PM 
Message: Timestamp: 4/24/2014 4:03:16 PM 
Message: Response exception: 
Path(http://localhost:XXXXX/Api/RetrieveQueuedPullCreditReport) 
Status(InternalServerError) 
Message: 
    {"Message":"An error has occurred.", 
    "ExceptionMessage":"Multiple actions were found that match the request: 
    \r\nSystem.Threading.Tasks.Task`1[ 
Our.WebServices.CreditReporting.Contracts.RetrieveQueuedPullCreditReportResponse] Post 
+0

Thử đăng nhập ngoại lệ bên trong. Bạn không chắc chắn lý do tại sao nó phải khác nhau theo IIS, nhưng tôi nghi ngờ rằng ngoại lệ thực sự có thể là ngoại lệ bên trong đó. Lưu ý rằng InnerException có thể là null, vì vậy hãy chắc chắn rằng mã đăng nhập của bạn kiểm tra trước khi viết nó ra (nếu không mã đó sẽ ném một ngoại lệ trong khi cố đăng nhập ...) –

+0

Tôi không chắc chắn rằng có một cách để truy cập ngoại lệ bên trong từ cách mã này được viết. Result.Content (đối tượng HTTPContent) không thực sự chứa một ngoại lệ. – cookiekitty

Trả lời

47

tôi thấy rằng những cần phải được bật trong GlobalConfiguration cho WebAPI bản thân:

1: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly; 
2: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
3: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never; 

Hành động máy chủ ual xác định bao nhiêu chi tiết để hiển thị, mặc định là LocalOnly.

Phương pháp ghi nhật ký của chúng tôi không được coi là cục bộ, tôi đoán vì nó không thực sự được tích hợp vào chính API, nhưng vì nó nằm trong một tệp được chia sẻ giữa nhiều API.

Tôi tìm thấy this bài viết rất hữu ích.

2

tôi đã sử dụng cái này:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
      = IncludeErrorDetailPolicy.Always; 

trong toàn cầu của API và nó thành công.

Các vấn đề liên quan