Ich habe einen Controller, der nur einen POST für diese URL akzeptiert:
%Vor% Der POST sollte vom Inhaltstyp application/json
sein, also habe ich das in meiner Routing-Tabelle:
Wo JsonConstraint
ist:
Wenn ich die Route benutze, bekomme ich eine 405 verboten:
The HTTP verb POST used to access path '/stores/123/products' is not allowed
Wenn ich jedoch die Einschränkung json = new JsonConstraint()
lösche, funktioniert es einwandfrei. Weiß jemand, was ich falsch mache?
Ich würde dies in einen Kommentar schreiben, aber es ist nicht genug Platz.
Beim Schreiben einer benutzerdefinierten Einschränkung ist es sehr wichtig, den Parameter routeDirection
zu überprüfen und sicherzustellen, dass Ihre Logik nur zur richtigen Zeit ausgeführt wird.
Dieser Parameter sagt Ihnen, ob Ihre Einschränkung ausgeführt wird, während eine eingehende Anfrage verarbeitet oder ausgeführt wird, während jemand eine URL generiert (z. B. wenn sie Html.ActionLink
aufrufen).
In deinem Fall denke ich, dass du all deinen passenden Code in ein riesiges "wenn" einfügen möchtest:
%Vor% Ich würde das JsonConstraint
debuggen und sehen, was der Inhaltstyp ist.
Es ist möglich, dass es aus irgendeinem Grund nicht application/json
ist.
Ich weiß, dass das der RFC-MIME-Typ ist, aber ich habe einige andere gesehen, die in meiner Zeit herumschweben (wie text/x-json
), wie hier in einem vorherige Frage .
Außerdem habe ich noch nie eine ContentType-Einschränkung gesehen, daher wäre es interessant zu sehen, ob es funktioniert. Haben Sie es mit anderen MIME-Typen ausprobiert, nur für den Fall, dass es fehlerhaft ist?
Und schließlich, anstatt nur eine einzige JsonConstraint zu haben, würde ich eine generische ContentTypeConstraint erstellen.
Aktualisierung:
Ich habe eine schnelle WebRequest-Methode für eine Route zusammengestellt, die den ContentTypeConstraint-Code verwendet und anscheinend korrekt funktioniert.
Aufzählung
%Vor%Einschränkungsklasse
%Vor%Dies würde mit Ihrem Beispiel wie folgt heißen:
%Vor%Dies war die Einschränkung, die für viel mehr als nur JSON wiederverwendbar ist. Der Switch-Fall kann auch abgeschafft werden, wenn Sie Beschreibungsattribute für die Enum-Klasse verwenden.
Tags und Links asp.net-mvc routing asp.net-mvc-routing