Adres URL, który próbuję udostępnić, jest w stylu: http://somedomain.com/api/people/staff.33311 (podobnie jak witryny LAST.FM zezwalają na wszelkiego rodzaju znaki w swoich adresach URL RESTFul & WebPage , na przykład „ http://www.last.fm/artist/psy'aviah ” to prawidłowy adres URL LAST.FM).
To, co działa, to następujące scenariusze: - http://somedomain.com/api/people/ - który zwraca wszystkich ludzi - http://somedomain.com/api/people/staff33311 - również by działał, ale to nie jest to, co ja ” m po tym, jak chciałbym, aby adres URL akceptował „kropkę”, jak w przykładzie poniżej - http://somedomain.com/api/people/staff.33311 - ale to daje mi
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Skonfigurowałem następujące rzeczy:
Kontroler „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); }
Plik 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 } ); }
Próbowałem już postępować zgodnie ze wszystkimi wskazówkami z tego wpisu na blogu http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx, ale nadal nie działa. Myślę też, że to dość żmudne i zastanawiam się, czy nie ma innego, lepszy i bezpieczniejszy sposób.
Mamy wewnętrzne Id, więc będziemy musieli znaleźć rozwiązanie, które pozwoli dopasować kropkę w taki czy inny sposób, najlepiej w stylu „”. ale jestem otwarty na alternatywne sugestie dotyczące adresów URL, jeśli zajdzie taka potrzeba ...
źródło
Odpowiedzi:
Poniższe ustawienie w
web.config
pliku powinno rozwiązać problem:źródło
Dodaj sufiks adresu URL ukośnikiem, np.
http://somedomain.com/api/people/staff.33311/
Zamiasthttp://somedomain.com/api/people/staff.33311
.źródło
google.com/my query goes here/
wersetachgoogle.com/subDomain my query goes here
.Zauważyłem, że dodanie następujących elementów przed standardem
ExtensionlessUrlHandler
rozwiązuje problem:Nie sądzę, że nazwa ma tak duże znaczenie, z wyjątkiem tego, że prawdopodobnie pomaga, jeśli twoje IDE (w moim przypadku Visual Studio) zarządza konfiguracją witryny.
H / T do https://stackoverflow.com/a/15802305/264628
źródło
Nie wiem, co naprawdę robię, ale po zabawie z poprzednią odpowiedzią wpadłem na inne, być może bardziej odpowiednie rozwiązanie:
źródło
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
Okazało się, że muszę zrobić coś więcej niż tylko ustawić
runAllManagedModulesForAllRequests
atrybut natrue
. Musiałem również upewnić się, że program obsługi adresów URL bez rozszerzeń został skonfigurowany do przeglądania wszystkich ścieżek. Ponadto istnieje jeszcze jedno dodatkowe ustawienie konfiguracji, które możesz dodać, co w niektórych przypadkach pomoże. Oto mój działający plik Web.config:Uwaga, w szczególności, że
ExtensionlessUrlHandler-Integrated-4.0
mapath
zestaw atrybutów się*
, w przeciwieństwie do*.
(na przykład).źródło
path="*."
. Ciekawe, jaki jest powód, dla którego ludzie to ustawilipath="*."
?path="*"
i miałem problem, ponieważ hostujemy witrynę z dokumentacją obok naszego interfejsu WebAPI, a ta witryna miała problemy z plikami .jpg, .png i innymi plikami z rozszerzeniami.<modules runAllManagedModulesForAllRequests="true" />
? To powinno sprawić, że .NET obsłuży te pliki statyczne.Utknąłem w tej sytuacji, ale dołączanie
/
na końcu adresu URL nie wyglądało na czyste.więc po prostu dodaj poniżej w tagu web.config
handlers
i będziesz gotowy .źródło
Okazało się, że oba sposoby działają dla mnie: albo ustawiając runAllManagedModulesForAllRequests na true, albo dodaj ExtentionlessUrlHandler w następujący sposób. Wreszcie zdecydowałem się dodać extensionUrLHandler, ponieważ runAllManagedModulesForAllRequests mają wpływ na wydajność witryny.
źródło
Użyłbym tego w pliku Web.config:
przed standardem „ExtensionlessUrlHandler”.
Na przykład w moim przypadku umieściłem to tutaj:
Dlatego wymuszasz, aby adresy URL o takim wzorcu były zarządzane przez Ciebie, zamiast standardowego zarządzania plikami w drzewie katalogów aplikacji.
źródło
Zmierzyłem się z tym samym problemem i okolicznościami, w których nie miałem grać z IIS i ustawieniami związanymi z konfiguracją witryny. Musiałem więc sprawić, by działało, wprowadzając zmiany tylko na poziomie kodu.
Prosta sprawa jest taka, że najczęstszym przypadkiem, w którym kończy się znak kropki w adresie URL, jest otrzymanie danych od użytkownika i przekazanie ich jako ciągu zapytania lub fragmentu adresu URL, aby przekazać jakiś argument do parametrów w metodzie akcji kontrolera.
Spójrz na poniższy adres URL, pod którym użytkownik wprowadza swój identyfikator użytkownika, aby uzyskać swoje dane osobowe:
Ponieważ musisz po prostu pobrać dane z serwera, używamy
GET
czasownika http . Podczas korzystania zGET
wywołań wszelkie parametry wejściowe mogą być przekazywane tylko we fragmentach adresu URL.Aby rozwiązać problem, zmieniłem czasownik http mojej czynności na
POST
.POST
Czasownik HTTP ma również możliwość przekazywania do treści danych wejściowych użytkownika lub nie-użytkownika. Utworzyłem więc dane JSON i przesłałem je do treściPOST
żądania http :Zmień definicję metody, jak poniżej:
Uwaga : więcej o tym, kiedy używać
GET
czasownika, a kiedyPOST
czasownika, tutaj .źródło