Wie verwende ich eine benutzerdefinierte Integritätsbedingung mit einer HttpMethodConstraint in ASP.NET MVC-Routing?

8

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:

%Vor%

Wo JsonConstraint ist:

%Vor%

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?

    
Daniel T. 28.01.2010, 23:26
quelle

2 Antworten

8

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%     
Eilon 29.01.2010, 02:03
quelle
4

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.

    
Dan Atkinson 23.05.2017 12:31
quelle