Die URL, die ich arbeiten lassen möchte, lautet wie folgt : http://somedomain.com/api/people/staff.33311 (genau wie Websites wie LAST.FM alle Arten von Zeichen in ihren RESTFul- und WebPage-URLs zulassen Beispiel: " http://www.last.fm/artist/psy'aviah " ist eine gültige URL für LAST.FM.
Was funktioniert, sind folgende Szenarien: - http://somedomain.com/api/people/ - das alle Personen zurückgibt - http://somedomain.com/api/people/staff33311 - würde auch funktionieren, aber es ist nicht das, was ich ' m nachdem ich möchte, dass die URL einen "Punkt" akzeptiert, wie im folgenden Beispiel - http://somedomain.com/api/people/staff.33311 - aber dies gibt mir einen
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Ich habe folgende Dinge eingerichtet:
Der Controller "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); }
Die 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 } ); }
Ich habe bereits versucht , nach all den Spitzen dieser Blogpost http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx aber es wird immer noch nicht .. Ich denke auch , es ist ziemlich langweilig , und ich frage mich , ob es nicht eine andere ist, besserer und sicherer Weg.
Wir haben unsere IDs intern so, also müssen wir eine Lösung finden, um den Punkt auf die eine oder andere Weise anzupassen, vorzugsweise im Stil von "." aber ich bin offen für alternative Vorschläge für URLs, wenn nötig ...
quelle
Antworten:
Die folgende Einstellung in Ihrer
web.config
Datei sollte Ihr Problem beheben:quelle
Suffix die URL mit einem Schrägstrich zB
http://somedomain.com/api/people/staff.33311/
statthttp://somedomain.com/api/people/staff.33311
.quelle
google.com/my query goes here/
vs.google.com/subDomain my query goes here
.Ich habe festgestellt, dass das Hinzufügen von Folgendem vor dem Standard
ExtensionlessUrlHandler
das Problem für mich löst:Ich denke nicht, dass der Name wirklich so wichtig ist, außer es hilft wahrscheinlich, wenn Ihre IDE (in meinem Fall Visual Studio) Ihre Site-Konfiguration verwaltet.
H / T an https://stackoverflow.com/a/15802305/264628
quelle
Ich weiß nicht, was ich wirklich tue, aber nachdem ich ein bisschen mit der vorherigen Antwort gespielt habe, habe ich eine andere, vielleicht passendere Lösung gefunden:
quelle
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
Ich stellte fest, dass ich mehr tun musste, als nur das
runAllManagedModulesForAllRequests
Attribut auf zu setzentrue
. Ich musste auch sicherstellen, dass der URL-Handler ohne Erweiterung so konfiguriert war, dass alle Pfade angezeigt werden. Darüber hinaus können Sie eine weitere Bonuskonfigurationseinstellung hinzufügen, die in einigen Fällen hilfreich ist. Hier ist meine funktionierende Web.config:Beachten Sie , speziell, dass die
ExtensionlessUrlHandler-Integrated-4.0
ITS -path
Attribut auf ,*
im Gegensatz zu*.
(zum Beispiel).quelle
path="*."
. Nur neugierig, was ist der Grund, warum die Leute das eingestellt habenpath="*."
?path="*"
und hatte ein Problem, weil wir eine Dokumentationssite neben unserer WebAPI hosten und diese Site Probleme mit .jpg, .png und anderen Dateien mit Erweiterungen hatte.<modules runAllManagedModulesForAllRequests="true" />
? Dadurch sollte .NET diese statischen Dateien verarbeiten können.Ich blieb in dieser Situation stecken, aber das Anhängen
/
am Ende der URL sah für mich nicht sauber aus.Fügen
handlers
Sie einfach unten im web.config- Tag hinzu, und schon kann es losgehen.quelle
Ich habe festgestellt, dass beides für mich funktioniert: entweder runAllManagedModulesForAllRequests auf true setzen oder ExtentionlessUrlHandler wie folgt hinzufügen. Schließlich habe ich mich entschieden, extensionUrLHandler hinzuzufügen, da runAllManagedModulesForAllRequests Auswirkungen auf die Leistung der Site haben.
quelle
Ich würde dies in der Datei Web.config verwenden:
vor dem Standard "ExtensionlessUrlHandler".
Zum Beispiel in meinem Fall habe ich es hier ausgedrückt:
Sie erzwingen also, dass URLs eines solchen Musters von Ihnen verwaltet werden, anstatt die Standardverwaltung als Dateien im Anwendungsverzeichnisbaum.
quelle
Ich hatte das gleiche Problem und die Umstände, unter denen ich nicht mit IIS- und Website-Konfigurationseinstellungen spielen sollte. Ich musste es also zum Laufen bringen, indem ich Änderungen nur auf Codeebene vornahm.
Der einfache Punkt ist, dass der häufigste Fall, in dem die URL ein Punktzeichen enthält, darin besteht, dass Sie Eingaben vom Benutzer erhalten und diese als Abfragezeichenfolge oder URL-Fragment übergeben, um ein Argument an die Parameter in der Aktionsmethode zu übergeben Ihres Controllers.
Schauen Sie sich die folgende URL an, unter der der Benutzer seine Benutzer-ID eingibt, um seine persönlichen Daten abzurufen:
Da Sie einfach einige Daten vom Server abrufen müssen, verwenden wir das http-
GET
Verb. Während der Verwendung vonGET
Aufrufen können alle Eingabeparameter nur in den URL-Fragmenten übergeben werden.Um mein Problem zu lösen, habe ich das http-Verb meiner Aktion in geändert
POST
. Das HTTP-POST
Verb bietet die Möglichkeit, auch Benutzer- oder Nichtbenutzereingaben im Text zu übergeben. Also habe ich JSON-Daten erstellt und an den Hauptteil der http-POST
Anforderung übergeben:Ändern Sie Ihre Methodendefinition wie folgt:
Hinweis : Hier erfahren Sie mehr darüber, wann
GET
und wannPOST
Verb verwendet werden soll .quelle