2014-04-12 3 views
10

In meiner WebAPI Klasse, ein ApiController, ich einen Anruf machen, wie:Wie geben Sie den Status 401 von WebAPI an AngularJS zurück und enthalten auch eine benutzerdefinierte Nachricht?

string myCustomMessage = .....; 

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

Als ich AngularJS $resource Service Call, kann ich die Antwort 401 im Statusfeld erhalten, in dem catch-Block des Versprechens . Die 401 passt HttpStatusCode.Unauthorized, also ist alles gut.

Das Problem ist jedoch, dass das Datenfeld der Antwort leer ist (null). Ich bekomme die myCustomMessage nicht zurück.

Jetzt, anstatt eine HttpResponseException Ausnahme zu werfen, ich nur eine regelmäßige Exception mit einer Nachricht werfen, diese Nachricht macht es zurück zu Angular Sway.

Ich muß in der Lage sein, beides zu tun: return eine benutzerdefinierte Nachricht vom Server, sowie der Status-Code zurückgegeben werden, was ich will, in diesem Fall 401.

Wer weiß, wie man diese Arbeit macht ?

[Bearbeiten] Lösung:

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

Was passiert, wenn Sie einfach '$ http' verwenden? –

+0

Karolis, ich bin in Ordnung mit einfachen $ http. Ich würde das tun, wenn wir festgestellt haben, dass $ Ressource nicht verwendet werden kann, um dieses Problem zu lösen. Wurde das bestätigt? –

Antwort

10

Versuchen Sie, HttpResponseMessage wie folgt zurückzugeben.

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

Dies sollte eine HTTP-Antwortnachricht wie diese erzeugen.

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

Ich brauche eine Lösung, wo ich die 'HttpResponseException' Ausnahme auslösen kann. Ihr Vorschlag, 'Request.CreateErrorResponse' zu ​​verwenden, bringt mich dorthin. Sieht aus wie der Code, den ich vor: 'werfen neue HttpResponseException (neu HttpResponseMessage (HttpStatusCode.Unauthorized) {ReasonPhrase = myMessage});' Wenn neu geschrieben mit 'CreateErrorRespons' löst das Problem:' throw new HttpResponseException (Request.CreateErrorResponse (HttpStatusCode.Unauthorized, mymessage)); ' –

+0

dies funktioniert nicht auf Web API 2 BTW seit IHttpAcionResult ist die neue beste Praxis. –

0

Ich benutze eine Antwort Abfangjäger dafür. Ein Antwort-Interceptor ist so ziemlich ein "Filter", wo alle Antworten passieren und ich kann nach dem Statuscode fragen und Logik ausführen.

Etwas wie folgt aus:

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

Über Ihre benutzerdefinierte Nachricht, können Sie es in einem HTTP-Header hinzuzufügen. In meinem Fall, wenn ich einen 401 bekomme, füge ich einen Standort-Header mit einer URL hinzu und umadressiere es.

Verwandte Themen