2014-04-12 10 views
10

W mojej klasie WebAPI, ApiController, nawiązywać połączenia, takie jak:W jaki sposób zwracasz status 401 z WebAPI do AngularJS, a także podajesz niestandardową wiadomość?

string myCustomMessage = .....; 

throw new HttpResponseException(
    new HttpResponseMessage(HttpStatusCode.Unauthorized) 
     { ReasonPhrase = myCustomMessage }); 

Kiedy połączenie przy użyciu angularjs $resource usługę, mam dostać 401 w polu statusu odpowiedzi, w bloku catch obietnicy . The 401 mecze HttpStatusCode.Unauthorized, więc wszystko dobrze.

Problem polega jednak na tym, że pole danych odpowiedzi jest puste (null). Nie otrzymuję zwrotu myCustomMessage.

Teraz, jeśli zamiast rzucać wyjątek HttpResponseException, po prostu wyrzucam zwykłego Exception z wiadomością, ta wiadomość sprawi, że powróci do Angular.

muszę być w stanie to zrobić zarówno: powrót niestandardowy komunikat z serwera, jak również mają zwrócony kod stanu jest to, co chcę, w tym przypadku 401.

Każdy wie, jak sprawić, że praca ?

[Edycja] Rozwiązanie:

throw new HttpResponseException(
    Request.CreateErrorResponse(HttpStatusCode.Unauthorized, myCustomMessage)); 
+0

Co się stanie, jeśli użyjesz zwykłego '$ http'? –

+0

Karolis, nie mam nic przeciwko używaniu zwykłego $ http. Zrobiłbym to, jeśli ustalimy, że $ zasób nie może być użyty do rozwiązania tego problemu. Czy to zostało potwierdzone? –

Odpowiedz

10

Spróbuj wrócić tak: HttpResponseMessage.

public HttpResponseMessage Get() 
{ 
    return Request.CreateErrorResponse(
       HttpStatusCode.Unauthorized, "You are not authorized"); 
} 

Powinno to wytworzyć komunikat odpowiedzi HTTP podobny do tego.

HTTP/1.1 401 Unauthorized 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/8.0 
Date: Sat, 12 Apr 2014 07:12:54 GMT 
Content-Length: 36 

{"Message":"You are not authorized"} 
+0

Potrzebuję rozwiązania, w którym można rzucić wyjątek 'HttpResponseException'. Twoja propozycja użycia 'Request.CreateErrorResponse' dostanie mnie tam. Wygląda to kod przed: 'rzut nowego HttpResponseException (New HttpResponseMessage (HttpStatusCode.Unauthorized) {ReasonPhrase = mymessage}); ' Gdy zapisane w' CreateErrorRespons' rozwiązuje problem: 'wyrzucić nowy HttpResponseException (Request.CreateErrorResponse (HttpStatusCode.Unauthorized, mymessage)); ' –

+0

to nie zadziała na api web 2 btw, ponieważ IHttpAcionResult to nowa najlepsza praktyka. –

0

użyć przechwytywania odpowiedzi na to. Przechwytywacz odpowiedzi to w zasadzie "filtr", w którym przechodzą wszystkie odpowiedzi i mogę zapytać o kod statusu i wykonać logikę.

coś takiego:

myModule.factory('responseInterceptor', function ($q) { 
    return { 
     response: function (res) { 
      switch(res.status){ 
      case 401: 
        // do what you want 
      } 
      return res; 
     }, 
     responseError: function (res) { 
      return $q.reject(res); 
     } 
    }; 
}); 

myModule.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('responseInterceptor'); 
}); 

O własnych wiadomość, można go dodać w nagłówku HTTP. W moim przypadku, gdy dostanę 401, dodaję nagłówek lokalizacji z adresem URL i przekierowuję do niego.

Powiązane problemy