2012-06-14 8 views
7

Tôi tuân theo các nguyên tắc từ bài đăng trên blog sau và tôi nhận được hành vi mà tôi mong đợi khi tôi gỡ lỗi Dịch vụ WCF của mình bằng máy chủ web tích hợp của Visual Studio 2010.Tại sao IIS 7 không trả về lỗi JSON? Hoạt động trên máy * my *

http://zamd.net/2008/07/08/error-handling-with-webhttpbinding-for-ajaxjson/

Khi ứng dụng của tôi ném một FaultException(), tôi có thể thấy các đại diện JSON của lỗi đó trên máy tính địa phương của tôi. Ứng dụng này cũng trả về HttpStatusCode thích hợp (trong trường hợp này là 401 trái phép), đó là hành vi mong muốn.

{"Code":"UserNotLoggedInFault","DisplayText":"You must be logged in to access this resource.","InternalText":"User is not logged in"} 

Khi tôi triển khai ứng dụng của tôi để IIS 7.0 mặc dù, tôi nhận được HttpStatusCode đúng, nhưng html trở lại là nội dung chung chung mà được kết hợp với mã trạng thái:

Bạn không có quyền để xem thư mục hoặc trang này.

Vì tính năng này hoạt động cục bộ, tôi cho rằng vấn đề là cài đặt cấu hình IIS. Tôi đã loại bỏ các giá trị IIS: Lỗi trang đã chặn trạng thái lỗi (nó được sử dụng để trả lại HTML được định dạng từ% SystemDrive% \ inetpub \ custerr \\ 401.htm)

Có ai biết cài đặt IIS nào tôi cần thay đổi không để cho phép phản hồi JSON chuyển qua khi Trạng thái HTTP nằm ngoài phạm vi 200 được trả về? ... hoặc có lẽ tôi cần phải làm gì khác?


CẬP NHẬT # 1

này chỉ xuất hiện để thể xảy ra khi ứng dụng của tôi ném một FaultException mà cũng đặt HttpStatusCode để trái phép (401). Nếu ứng dụng của tôi trả về mã trạng thái 404 Not Found, thì JSON được trả về đúng.

Câu hỏi vẫn đứng, nhưng tôi cho rằng nó chỉ áp dụng để trả về mã trạng thái không được phép 401.

Dưới đây là một số ảnh chụp màn hình của phản ứng như bắt bởi Charles Web Proxy

http://imgur.com/a/MkRRI

Đây là những gì nó trông giống như khi tôi đánh máy địa phương của tôi

http://imgur.com/a/RMmsa


CẬP NHẬT # 2

Vì vậy, điều này không không xảy ra nếu tôi từ xa máy tính để bàn vào máy chủ và nhấn trang web thông qua localhost. Khi tôi nhấn URL yêu cầu xác thực, tôi nhận được đối tượng JSON thích hợp trả về.

http://i.imgur.com/J5oNn.png

Vì vậy, không có nghĩa là IIS đối xử với 401 mã trạng thái khác nhau và rằng người dùng không có chứng thực được bảo vệ khỏi những phản ứng thích hợp?

+0

Lưu trữ cục bộ của bạn - IIS hoặc IIS Express là gì? Bạn có thể trở thành phản hồi từ các trang web khác trên máy chủ không? – Regfor

+0

Tại địa phương, tôi đang chạy WebDev.WebServer40.exe. Trên máy chủ Windows Server 2008 IIS 7 của tôi, tôi có thể POST và GET các đối tượng JSON và mọi thứ hoạt động tốt, ngoại trừ khi tôi ném một FaultException. Khi tôi ném nó cục bộ, tôi nhận được cấu trúc JSON. Khi tôi ném nó vào hộp Windows Server/IIS, tôi nhận được thông báo "Bạn không có quyền xem thư mục hoặc trang này". phản ứng. – JackAce

+0

Và còn về các ứng dụng web khác hoặc dịch vụ từ máy chủ. Bạn có thể thực hiện các cuộc gọi HTTP thành công đến một thứ khác từ máy chủ không? – Regfor

Trả lời

-1

Trình duyệt của bạn đang tạo trình duyệt "Bạn không có quyền". Tôi cho rằng bạn đang xem phản hồi cho yêu cầu trong trình duyệt; Tôi đoán IE.

IE đang tạo trang "thân thiện" cho bạn, với phản hồi 401. IE không phải là một khách hàng json, và nó nghĩ rằng người gọi là một con người (hầu như luôn luôn chính xác). Vì vậy, nó hiển thị một trang thân thiện với con người.

Nếu bạn cù rằng URL có Fiddler hoặc với wget.exe hoặc một số công cụ không phải trình duyệt khác, bạn sẽ thấy kết quả chính xác với mã trạng thái 401 và phản hồi json.

Không chắc chắn điều gì xảy ra trên các trình duyệt khác.

Để biết thêm về các trang lỗi "thân thiện" trong IE, bao gồm cách tắt chúng, hãy xem this article from Eric Lawrence (author of Fiddler).

+1

Đó là * không * được tạo bởi trình duyệt. Tôi đang sử dụng Charles làm proxy web và văn bản phản hồi hiển thị "Bạn không được phép xem thư mục hoặc trang này". – JackAce

+0

Dưới đây là một số ảnh chụp màn hình của câu trả lời của Charles Web Proxy http://imgur.com/a/MkRRI – JackAce

+0

Tôi không biết charles hoạt động như thế nào. Bạn có thể sử dụng Fiddler? (Chỉ có các charles nó không phụ thuộc vào Java). Thế còn wget? Curl? ngay cả một jscript sử dụng XmlHttpRequest? Tôi sẽ kiểm tra lại những gì Charles đang nói với bạn. Ứng dụng của bạn có thực sự nhìn thấy thông báo "Bạn không có quyền ..." không? Hoặc bạn thấy rằng chỉ trong các công cụ chẩn đoán bạn đang sử dụng. Dường như thông điệp đó đang được tiêm bởi một cái gì đó trong chuỗi công cụ, chứ không phải bởi IIS. – Cheeso

6

Chúng tôi đã tìm thấy cài đặt trong cấu hình IIS "Lỗi trang" để khắc phục hành vi đó.

Bạn cần đặt phản hồi lỗi thành "Lỗi chi tiết", mặc định là "Lỗi chi tiết cho yêu cầu cục bộ và trang lỗi tùy chỉnh cho yêu cầu từ xa". Bạn có thể đặt nó trong trang web hoặc toàn bộ máy chủ của mình.

Dường như đối tượng địa lý quyết định hiển thị trang lỗi tùy chỉnh cho 401 thay vì cung cấp thêm chi tiết cho khách hàng không được ủy quyền.

Chỉ cần đảm bảo rằng lỗi dịch vụ của bạn xử lý bảo vệ ngoại lệ, nếu không khách hàng có thể thấy một chồng xếp chồng.

+0

Điều này giải quyết được vấn đề tương tự đối với tôi. Tôi đã cố gắng trả lại trạng thái 400 với một số json mô tả cho các yêu cầu không hợp lệ. Trên máy tính của tôi nó làm việc rất lớn, trên máy chủ, tôi muốn nhận được phản hồi html html. @ Hector - cảm ơn! –