L'URL que j'essaie de laisser travailler est celle du style: http://somedomain.com/api/people/staff.33311 (tout comme les sites comme LAST.FM autorisent toutes sortes de signes dans leurs URL RESTFul & WebPage , par exemple " http://www.last.fm/artist/psy'aviah " est une URL valide pour LAST.FM).
Ce qui fonctionne, ce sont les scénarios suivants: - http://somedomain.com/api/people/ - qui renvoie toutes les personnes - http://somedomain.com/api/people/staff33311 - fonctionnerait également, mais ce n'est pas ce que je ' m après je voudrais que l'URL accepte un "point", comme l'exemple ci-dessous - http://somedomain.com/api/people/staff.33311 - mais cela me donne un
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
J'ai mis en place les choses suivantes:
Le contrôleur "PeopleController"
public IEnumerable<Person> GetAllPeople() { return _people; } public IHttpActionResult GetPerson(string id) { var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower())); if (person == null) return NotFound(); return Ok(person); }
Le WebApiConfig.cs
public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
J'ai déjà essayé de suivre tous les conseils de ce blog http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx mais ça ne fonctionnera toujours pas .. Je pense aussi que c'est assez fastidieux et je me demande s'il n'y en a pas d'autre, manière meilleure et plus sûre.
Nous avons nos identifiants en interne comme ça, donc nous allons devoir trouver une solution pour adapter le point d'une manière ou d'une autre, de préférence dans le style "." mais je suis ouvert à d'autres suggestions d'urls si besoin est ...
Réponses:
Le paramètre suivant dans votre
web.config
fichier devrait résoudre votre problème:la source
Suffixez l'URL avec une barre oblique, par exemple
http://somedomain.com/api/people/staff.33311/
au lieu dehttp://somedomain.com/api/people/staff.33311
.la source
google.com/my query goes here/
contregoogle.com/subDomain my query goes here
.J'ai constaté que l' ajout de ce qui suit avant la norme
ExtensionlessUrlHandler
résout le problème pour moi:Je ne pense pas que le nom compte vraiment autant, sauf qu'il aide probablement si votre IDE (Visual Studio dans mon cas) gère la configuration de votre site.
H / T à https://stackoverflow.com/a/15802305/264628
la source
Je ne sais pas vraiment ce que je fais, mais après avoir joué un peu avec la réponse précédente, j'ai trouvé une autre solution, peut-être plus appropriée:
la source
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
J'ai trouvé que je devais faire plus que simplement définir l'
runAllManagedModulesForAllRequests
attributtrue
. Je devais également m'assurer que le gestionnaire d'URL sans extension était configuré pour regarder tous les chemins. De plus, vous pouvez ajouter un paramètre de configuration supplémentaire qui vous aidera dans certains cas. Voici mon Web.config de travail:Note, en particulier, que le
ExtensionlessUrlHandler-Integrated-4.0
a sonpath
ensemble d'attributs à*
par opposition à*.
(par exemple).la source
path="*."
. Juste curieux, quelle est la raison pour laquelle les gens ont choisi celapath="*."
?path="*"
eu un problème parce que nous hébergeons un site de documentation côte à côte avec notre WebAPI et que ce site avait des problèmes avec .jpg, .png et d'autres fichiers avec des extensions.<modules runAllManagedModulesForAllRequests="true" />
? Cela devrait permettre à .NET de gérer ces fichiers statiques.Je suis resté coincé dans cette situation, mais l'ajout
/
à la fin de l'URL ne me paraissait pas clair.alors ajoutez simplement ci-dessous dans la balise web.config
handlers
et vous serez prêt à partir.la source
J'ai trouvé que les deux méthodes fonctionnent pour moi: soit en définissant runAllManagedModulesForAllRequests sur true, soit en ajoutant ExtentionlessUrlHandler comme suit. Enfin, je choisis d'ajouter extensionUrLHandler car runAllManagedModulesForAllRequests a un impact sur les performances du site.
la source
J'utiliserais ceci dans le fichier Web.config:
avant "ExtensionlessUrlHandler" standard.
Par exemple, dans mon cas, je l'ai mis ici:
Vous forcez donc la gestion des URL d'un tel modèle, au lieu de la gestion standard sous forme de fichiers dans l'arborescence des répertoires d'applications.
la source
J'ai été confronté au même problème et aux circonstances dans lesquelles je n'étais pas censé jouer avec IIS et les paramètres liés à la configuration du site Web. J'ai donc dû le faire fonctionner en apportant des modifications au niveau du code uniquement.
Le point simple est que le cas le plus courant où vous finirez par avoir un caractère point dans l'URL est lorsque vous obtenez une entrée de l'utilisateur et que vous la transmettez sous forme de chaîne de requête ou de fragment d'URL pour passer un argument aux paramètres de la méthode d'action de votre contrôleur.
Jetez un œil à l'URL ci-dessous où l'utilisateur entre son identifiant pour obtenir ses informations personnelles:
Puisque vous devez simplement récupérer des données du serveur, nous utilisons le
GET
verbe http . En utilisantGET
appels, tous les paramètres d'entrée ne peuvent être transmis que dans les fragments d'URL.Donc, pour résoudre mon problème, j'ai changé le verbe http de mon action en
POST
. LePOST
verbe HTTP a la possibilité de transmettre également toute entrée utilisateur ou non utilisateur dans le corps. J'ai donc créé une donnée JSON et l'ai passée dans le corps de laPOST
requête http :Modifiez la définition de votre méthode comme ci-dessous:
Remarque : Plus d'informations sur quand utiliser
GET
verbe et quand utiliserPOST
verbe ici .la source