Peut être utilisé dans les périodes de Asp.Net l'Api Web de Routes?
Je suis en train de travailler sur le déplacement d'un projet d'API à partir de matières de gestionnaires http là où je suis en utilisant des périodes dans les chemins:
http://server/collection/id.format
Je voudrais suivre le même schéma d'URL dans un site Web Api (auto-hébergé) version, et j'ai essayé ceci:
var c = new HttpSelfHostConfiguration(b);
c.Routes.MapHttpRoute(
name: "DefaultApiRoute",
routeTemplate: "{controller}/{id}.{format}",
defaults: new { id = RouteParameter.Optional, format = RouteParameter.Optional },
constraints: null
);
Malheureusement, ça ne semble pas résoudre (ce qui est conforme 404 sur /foo /foo/bar et /foo/bar.txt). Un schéma similaire à l'aide d'une barre oblique avant "format" fonctionne très bien:
var c = new HttpSelfHostConfiguration(b);
c.Routes.MapHttpRoute(
name: "DefaultApiRoute",
routeTemplate: "{controller}/{id}/{format}",
defaults: new { id = RouteParameter.Optional, format = RouteParameter.Optional },
constraints: null
);
Je n'ai pas encore fouillé dans le code de l'Api Web, et avant que je ne pensais que je voudrais poser ici pour voir si cela est connu, ou peut-être même justifie la limitation de l'Api Web.
Mise à JOUR: j'ai négligé de mentionner que la "id" et "format" sont des chaînes de caractères, ce qui s'avère important pour la solution à cette question. L'ajout d'une contrainte d'exclure les périodes de la "id" jeton résout le 404 problème.
- Face à une très même problème moi-même: stackoverflow.com/questions/11487181/... | aussi loin Que je peux dire, un point ne peut pas être utilisé dans une URL. J'espère que je suis tort cependant.
- Avez-vous essayé d'hériter de
Controller
et remplacer tout ce qui vient à travers laInitialize
?
Vous devez vous connecter pour publier un commentaire.
Je n'arrive pas à reproduire le problème. Cela devrait fonctionner. Voici ma configuration:
Microsoft.AspNet.WebApi.SelfHost
NuGetDéfinir un
Product
Un correspondant de l'API Contrôleur:
Et un hôte:
Maintenant, lorsque vous exécutez cette application console vous pourriez naviguer à
http://localhost:8080/products/123.xml
. Mais bien sûr, vous pourriez naviguer àhttp://localhost:8080/products/123.json
et vous aurez toujours XML. La question est donc: Comment faire pour activer la négociation de contenu à l'aide d'un paramètre de route?Vous pouvez effectuer les opérations suivantes:
et maintenant, vous pouvez utiliser les url suivantes:
Maintenant, vous demandez peut-être quel est le rapport entre la
{ext}
paramètre de route que nous avons utilisé dans notre définition de la route et laAddUriPathExtensionMapping
méthode parce que nulle part nous n'avons pas le spécifier. Eh bien, devinez quoi: c'est codé en dur dans leUriPathExtensionMapping
classe deext
et vous ne pouvez pas le modifier car il est en lecture seule:Tout cela, pour répondre à votre question:
Oui.
J'ai été en mesure d'atteindre cet objectif en procédant de la manière suivante:
remplacer
"*."
avec"*"
dans le système.serveur web.les gestionnaires dans le web.config, c'est à dire supprimer la période.<add name="ExtensionlessUrlHandler-Integrated-4.0-API" path="api/*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
. btw, le nom n'est pas important.Être prudent pour définir runAllManagedModulesForAllRequests option dans les modules de l'attribut dans votre site web.config
Sinon il ne fonctionnera pas dans IIS (il serait probablement être manipulés par des non-gestionnaires managés).
Je l'accepte Darin réponse (oui, les périodes peuvent être utilisés dans le circuit des adresses url) parce que c'est précisément correct de mon exemple, mais inutile pour moi. C'est de ma faute pour ne pas en indiquant expressément que les "id" est une chaîne de caractères, un entier.
D'utilisation d'une période à la suite d'une chaîne de caractère en paramètre le moteur de routage besoins de conseils sous la forme d'une contrainte:
L'ajout de la contrainte à la précédente jeton permet entrant Url pour être correctement décomposés et transformés. Sans l'indice, le "id" de jeton peut être interprété pour correspondre au reste de l'étendue de l'URL. C'est juste un cas particulier d'avoir besoin de contraintes pour délimiter les frontières entre les paramètres de la chaîne en général.
Oui, les périodes peuvent être utilisés dans les URL des routes dans le Asp.Net l'API Web, mais si ils sont à suivre un paramètre de chaîne assurez-vous d'utiliser les bonnes contrainte à la route.
IIS intercepte les requêtes avec une période de téléchargements de fichiers. Dans votre site web.la configuration, vous pouvez configurer IIS pour ignorer URL spécifique chemins parce que la webapi va gérer les demandes de la place. Si vous voulez IIS pour gérer les téléchargements de fichiers ainsi que les processus de webapi des appels, vous pouvez ajouter un ManagedDllExtension de configuration du système.serveur web.les gestionnaires dans le web.config.