2011-08-23 10 views
6

Tôi đang cố gắng xác thực yêu cầu HTTP nhận được bởi một dịch vụ. Tôi muốn kiểm tra xem tất cả các tiêu đề bắt buộc có mặt không. Nếu không, tôi muốn ném một ngoại lệ, ở một nơi nào đó, hãy đặt mã phản hồi thích hợp và dòng trạng thái của phản hồi. Tôi không muốn chuyển hướng người dùng đến bất kỳ trang lỗi cụ thể nào, chỉ cần gửi câu trả lời.Cách thích hợp để xác thực yêu cầu HTTP và trả về các phản hồi HTTP cụ thể trong Global.asax là gì?

Tôi tự hỏi tôi nên đặt mã ở đâu? Dự đoán đầu tiên của tôi là xác thực các yêu cầu trong Application_BeginRequest, ném một ngoại lệ về lỗi và xử lý yêu cầu trong Application_Error.

Ví dụ:

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if(!getValidator.Validate(HttpContext.Current.Request)) 
    { 
     throw new HttpException(486, "Something dark is coming"); 
    } 
} 

public void Application_Error(object sender, EventArgs e) 
{ 
    HttpException ex = Server.GetLastError() as HttpException; 
    if (ex != null) 
    { 
      Context.Response.StatusCode = ex.ErrorCode; 
      Context.Response.Status = ex.Message; 
    } 
} 

Rõ ràng, trong những trường hợp như Visual Studio phàn nàn về một ngoại lệ unhandled trong Application_BeginRequest. Nó hoạt động, vì mã đã cho được trả lại cho máy khách, nhưng tôi cảm thấy có gì đó sai với cách tiếp cận này.

[Chỉnh sửa]: Tôi đã xóa câu hỏi thứ hai về dòng trạng thái tùy chỉnh, vì những câu hỏi này không thực sự được kết nối.

Cảm ơn bạn đã trợ giúp.

+0

WCF sẽ phát ở đâu? Bạn đang xây dựng một dịch vụ REST được lưu trữ trong IIS? –

+0

Vâng, vâng. Tôi tin rằng đó là một trong các tùy chọn, trái ngược với việc lưu trữ một dịch vụ như một dịch vụ quản lý cửa sổ/ứng dụng được quản lý (theo msdn) –

Trả lời

6

Phá vỡ Visual Studio thực hiện theo mặc định khi một ngoại lệ được ném. Bạn có thể thay đổi hành vi này bằng cách vào Debug -> Exceptions và bỏ chọn các hộp kiểm bên cạnh ngoại lệ thời gian chạy ngôn ngữ chung. Tuy nhiên, vấn đề chính ở đây là bạn đang ném một ngoại lệ chỉ để bạn có thể nắm bắt nó và thiết lập mã trạng thái trên phản hồi. Bạn có thể làm điều đó mà không ném một ngoại lệ. ví dụ. void Application_BeginRequest(object sender, EventArgs e) { if(!getValidator.Validate(HttpContext.Current.Request)) { HttpContext.Current.Response.StatusCode = 403 var httpApplication = sender as HttpApplication; httpApplication.CompleteRequest(); } }

+0

Điều đó giải quyết được vấn đề của tôi, cảm ơn bạn rất nhiều! –