0
votes

L'acheminement conventionnel ASP.NET WebAPI fonctionne-t-il sans spécifier les contraintes d'action et de verbe HTTP?

Dans notre projet classique ASP.NET WebAPI, nous pourrions déclarer un itinéraire et le cadre sélectionnerait l'action correcte en fonction du verbe HTTP dans la demande.

Toutefois, dans le webapI de base, j'ai essayé la configuration d'itinéraire suivante. p> xxx pré>

mon contrôleur a une méthode p> xxx pré>

Lorsque vous essayez l'URL suivante, je reçois 404 alors que dans un aspect classique similaire Le projet WebAPI .NET WebAPI Il exécutera automatiquement la méthode GET. P>

https://localhost/weatherforecast


0 commentaires

3 Réponses :


0
votes

Routing est responsable de la mise en mappage de la demande d'URL à un point d'extrémité et il est livré avec deux types de routage conventionnel conventionnel et d'attributs.

et de votre question, vous vous attendez à un routage conventionnel avec une routage par défaut que vous pouvez y par défaut. ligne de code. xxx

Remarque: mais gardez à l'esprit que le routage de la convétion ne fonctionnera pas si vous décorez votre contrôleur avec [Apicontroller] Attribut.

par Par défaut .NET CORE prend en charge l'acheminement de l'attribut afin de préfixer l'itinéraire en plaçant l'attribut [Route] sur un niveau de contrôleur. S'il vous plaît voir ci-dessous exemple xxx

Le code ci-dessus fonctionnera comme prévu (routage d'attribut).

Si vous décorez votre contrôleur par [Apicontroller] Attribut Ensuite, vous devez utiliser le routage d'attributs et tout routage conventionnel défini dans la classe de démarrage sera remplacé. S'il vous plaît voir plus de détails ici .


0 commentaires

0
votes

Cela signifie-t-il pour le routage conventionnel que nous devons ajouter de multiples itinéraires avec le même modèle, avec des contraintes d'action par défaut et de méthode HTTP pour fonctionner correctement? P>

Oui, dans ASP.NET CORE Web API, si vous souhaitez utiliser le routage conventionnel, vous devez supprimer [apicontroller] code> attribut et [itinéraire] code> Attribut d'une autre et Utilisez l'itinéraire suivant avec action par défaut p> xxx pré>

se référer à Routage conventionnel dans API ASP.NET CORE P>

MISE À JOUR: Utilisation de la réécriture d'URL forte> p>

Vous pouvez toujours écrire votre propre URL réécrire les règles pour répondre à vos exigences.Ferfer vers la démo ci-dessous qui traite de l'URL comme / weatherforecast code>: p>

Créer des règles de réécriture: p>

app.UseRewriter(new RewriteOptions().Add(new RewriteRuleTest()));
app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapControllerRoute(
        name: "GetRoute",
        pattern: "{controller=WeatherForecast}/{action=Get}/{id?}"
    );
});


6 commentaires

Alors, que se passe-t-il, si la demande est un poste ou mis, mais l'URL est / WeatheroForecast? Dans ce cas, il exécutera la méthode d'obtention car c'est l'action par défaut même si le verbe HTTP ne reçoit pas?


@stormtrooper Non, ci-dessus Configuration n'est qu'un exemple.it suit également la règle / contrôleur / action pour toutes les demandes, il devrait donc être / weatheroforecast / post .


OK, vous voulez dire pour cette configuration ci-dessus, une demande postale avec URL / WeatherEforecast retournera 404? Cela signifie que pour une demande postale avec URL / WeathereForecast de fonctionner, un itinéraire supplémentaire avec la contrainte httpmethod doit être configuré, n'est-ce pas?


@stormtrooper Pas vraiment, pour faire une astuce consiste à ajouter {contrôleur = weatherforecast} / {action = post} / {id?} Quel code ci-dessus a fait est la même chose à MVC.Pourquoi ne vous Vous voulez le nom d'action dans l'URL?


@stormtrooper J'essaie avec la réécriture d'URL et peut-être que c'est une solution de contournement. Voir ma réponse modifiée.


Ce que j'essaie, c'est de ne pas trouver une solution pour faire fonctionner ce parcours, mais plutôt pour comprendre et confirmer comment le routage fonctionne différemment dans Classic ASP.NET WebAPI vs ASP.NET CORE webapi. J'ai trouvé une question Stackoverflow qui tente de simuler ce comportement dans Classic .NET WebAPI, semble ajouter de multiples itinéraires est le seul moyen: Stackoverflow.com/questions/47995696/...



0
votes

J'ai trouvé une question qui tente de simuler ce comportement dans classique asp.net webapi dans asp.net noyau: Action de route basée sur le verbe http?

L'exemple est dans .NET CORE 2 et MVC, mais l'essayer dans .NET CORE 3 WebapI fonctionne de la même manière.

semble que la réponse est non, dans ASP.NET CORE WebAPI, si la route n'a pas d'action dans le modèle de route et aucune contrainte de méthode HTTP, le framework n'essaiera pas automatiquement de faire correspondre avec des actions en fonction du verbe HTTP les demandes. Afin de réaliser cela, plusieurs voies avec des actions par défaut et des contraintes de verbe doivent être ajoutées.


0 commentaires