2011-08-23 13 views
6

Próbuję sprawdzić poprawność żądania HTTP odebranego przez usługę. Chcę sprawdzić, czy wszystkie wymagane nagłówki są obecne itp. Jeśli nie, chciałbym rzucić wyjątek, który w pewnym miejscu ustawi odpowiedni kod odpowiedzi i linię statusu odpowiedzi. Nie chcę przekierowywać użytkownika do żadnej konkretnej strony błędu, wystarczy wysłać odpowiedź.Jaki jest właściwy sposób sprawdzania poprawności żądań HTTP i zwracania określonych odpowiedzi HTTP w pliku Global.asax?

Zastanawiam się, gdzie powinienem umieścić kod? Moim pierwszym przypuszczeniem było sprawdzenie poprawności żądań w Application_BeginRequest, zgłoszenie wyjątku dotyczącego błędu i obsłużenie go w Application_Error.

Na przykład:

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; 
    } 
} 

Najwyraźniej w takich przypadkach Visual Studio narzeka nieobsługiwany wyjątek w Application_BeginRequest. Działa, ponieważ dany kod jest zwracany klientowi, ale czuję, że coś jest nie tak z tym podejściem.

[Edytuj]: Usunąłem drugie pytanie dotyczące niestandardowego wiersza statusu, ponieważ te pytania nie są naprawdę połączone.

Dzięki za pomoc.

+0

Skąd wziąć udział WCF? Czy budujesz usługę REST hostowaną w IIS? –

+0

Cóż, tak. Wierzę, że jest to jedna z opcji, w przeciwieństwie do hostingu usługi jako zarządzanej usługi Windows/zarządzanej aplikacji (zgodnie z msdn). –

Odpowiedz

6

Program Visual Studio wykonuje domyślnie przerwanie wykonania, gdy zostanie zgłoszony wyjątek. Możesz zmienić to zachowanie, przechodząc do Debuguj -> Wyjątki i usuwając zaznaczenie pól wyboru obok wyjątków środowiska wykonawczego języka wspólnego. Jednak głównym problemem jest tutaj wyrzucanie wyjątku, aby można było go przechwycić i ustawić kod statusu odpowiedzi. Możesz to zrobić bez rzucania wyjątku. na przykład 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

To rozwiązuje mój problem, dziękuję bardzo! –

Powiązane problemy