2014-04-12 3 views
10

Nella mia classe WebAPI, un ApiController, faccio una chiamata come ad esempio:Come si restituisce lo stato 401 da WebAPI a AngularJS e si include anche un messaggio personalizzato?

string myCustomMessage = .....; 

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

Quando ho chiamata usando AngularJS $resource servizio, io capisco 401 nel campo di stato della risposta, nel blocco catch della promessa . Il 401 corrisponde a HttpStatusCode.Unauthorized, quindi va tutto bene.

Il problema, tuttavia, è che il campo dati della risposta è vuoto (null). Non viene restituito myCustomMessage.

Ora, se invece di lanciare un'eccezione HttpResponseException, ho appena lanciato un normale Exception con un messaggio, tale messaggio lo fa tornare ad Angular.

Ho bisogno di essere in grado di fare entrambe le cose: restituire un messaggio personalizzato dal server, così come hanno il codice di stato restituito essere quello che voglio, in questo caso 401.

Qualcuno sa come fare quel lavoro ?

[modifica] Soluzione:

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

Cosa succede se si utilizza semplicemente '$ http'? –

+0

Karolis, sto bene usando semplicemente $ http. Lo farei se abbiamo stabilito che $ risorse non possono essere utilizzate per risolvere questo problema. È stato confermato? –

risposta

10

Prova a restituire HttpResponseMessage in questo modo.

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

Questo dovrebbe produrre un messaggio di risposta HTTP come questo.

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

Ho bisogno di una soluzione in cui posso lanciare l'eccezione 'HttpResponseException'. La tua proposta di usare "Request.CreateErrorResponse' mi porta lì. Sembra che il codice che ho davanti: 'gettare nuova HttpResponseException (nuova HttpResponseMessage (HttpStatusCode.Unauthorized) {ReasonPhrase = myMessage});' Quando riscritta con 'CreateErrorRespons' risolve il problema:' throw new HttpResponseException (Request.CreateErrorResponse (HttpStatusCode.Unauthorized, mymessage)); ' –

+0

questo non funzionerà su web api 2 btw poiché IHttpAcionResult è la nuova best practice. –

0

io uso un intercettore di risposta per questo. Un interceptor di risposta è praticamente un "filtro" in cui passano tutte le risposte e posso chiedere informazioni sul codice di stato ed eseguire la logica.

Qualcosa di simile a questo:

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

Circa il tuo messaggio personalizzato, è possibile aggiungerlo in un'intestazione HTTP. Nel mio caso, quando ottengo un 401, aggiungo un'intestazione di posizione con un url e reindirizza ad esso.

Problemi correlati