2016-07-16 17 views
0

Also meine Hauptfrage ist im Titel. Wie ist es möglich, zu vermeiden, dass der Browser den Http-Statuscode 406 auslöst, sobald eine ungültige Methode geliefert wird?ASP.NET MVC Web API nur in 1 verfügbar Http-Methode, aber nicht Http Statuscode 406, wenn es eine andere Methode hat

Ich habe versucht standardmäßig alle eingehenden Methoden zu ermöglichen, indem [AcceptVerbs("GET", "POST", "PUT", "DELETE")] und danach mit dem tatsächlichen erlaubt Verfahren zum Ausfiltern von dieser Methode:

private bool CheckAllowedMethod(HttpMethod allowed, HttpMethod given) 
{ 
    if (allowed == given) 
    { 
     return true; 
    } 

    throw new InvalidMethodException("This method is not available over " + Request.Method.Method); 
} 

Obwohl dies funktioniert, ist es nicht sehr ordentlich . Das Verhalten, das ich vermeiden möchte, wenn [HttpPost] oder ein Äquivalent von denen verwendet wird, ist, dass der Browser einen HTTP-Statuscode 406 ausgibt und buchstäblich nichts auf die Site druckt, obwohl ich jederzeit eine JSON-Zeichenfolge anzeigen möchte.

Also, ist dies möglich einfacher oder muss ich meine aktuelle Methode verwenden?

Voll Code:

[AcceptVerbs("GET", "POST", "PUT", "DELETE")] 
[Route("api/Auth/Login/{apikey}")] 
public HttpResponseMessage GenerateLoginCode(string apikey = "") { 
HttpResponseMessage response = CreateResponse(); 

try { 
    CheckAllowedMethod(HttpMethod.Post, Request.Method); 

    ChangeContent(response, JSONString.Create(Apikey.Login(apikey))); 
} catch (Exception ex) { 
    ChangeContent(response, Error.Create(ex)); 
} 

return response; 
} 

private HttpResponseMessage CreateResponse() { 
return Request.CreateResponse(HttpStatusCode.OK); 
} 

private void ChangeContent(HttpResponseMessage res, string data) { 
res.Content = new StringContent(data, System.Text.Encoding.UTF8, "application/json"); 
} 

private bool CheckAllowedMethod(HttpMethod allowed, HttpMethod given) { 
if (allowed == given) { 
    return true; 
} 

throw new InvalidMethodException("This method is not available over " + Request.Method.Method); 
} 
+1

Möchten Sie "406 nicht akzeptabel" oder "405 Methode nicht erlaubt" servieren? (https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error) –

+0

Ich möchte eigentlich nichts als 200 OK servieren. Wenn etwas auf der Serverseite schief ging, liefert es nur eine JSON-Zeichenfolge mit den Details des Fehlers. Wenn ich jedoch [HttpPost] vor die Methode bringe und ich versuche, über den Browser (get) darauf zuzugreifen, gibt es 406. – Thodor12

+1

Siehe meine Antwort für einen Weg, dies zu erreichen. Ich möchte Ihnen jedoch empfehlen, die HTTP-Statuscodes zu verwenden, auch wenn Sie * auch * einige Inhalte im Hauptteil hinzufügen. Dadurch wird es viel einfacher, Ihre API zu verwenden. (Ich habe in letzter Zeit einige Zeit damit verbracht, eine API zu konsumieren, die bei jeder Anfrage unabhängig vom tatsächlichen Status mit "200 OK" antwortet und dann Fehlerinformationen im Hauptteil hatte. Obwohl die API-Spezifikation genauso aussagekräftig aussieht wie HTTP-Statuscodes ein Mensch, es machte den Client-Code viel unordentlicher, da alle verfügbaren Hilfsklassen gebaut werden, um für das HTTP-Protokoll zu sorgen.) –

Antwort

2

Ich würde das nicht tun alle Methoden und Filterung manuell über die Annahme, sondern mit einer Middleware, die die Fehlerreaktion fängt und schreibt sie.

Ich grub ziemlich tief in Fehlerbehandlung in Web API 2 earlier this year, und erweiterte auf meine Erkenntnisse in this blog post. Wenn Sie etwas Ähnliches tun, können Sie die Ausnahme von einer nicht erlaubten Methode in einer speziellen catch-Klausel in der Middleware behandeln und alles, was Sie wollen, in die Antwort schreiben.

+0

Vielen Dank, ich werde definitiv in das schauen und sehen, was ich mir vorstellen kann. – Thodor12