Wszystkie żądania do ASP.NET Web API zwracają błąd 404
Mam stronę internetową ASP.NET MVC 4, która zawiera Web API. Witryna jest rozwijana i testowana z Visual Studio 2012 i .NET 4.5 w systemie Windows 8 z IIS Express jako serwerem WWW.W tym środowisku programistycznym wszystko działa.
Teraz jest wdrażany na serwerze Windows 2008 R2 (SP1) z IIS 7.5. .NET 4.0 i 4.5 są zainstalowane. Pula aplikacji działa z .NET 4.0 w zintegrowanym trybie rurociągu.
W tym środowisku produkcyjnym działa strona internetowa MVC, Web API nie. Na każde żądanie, niezależnie od tego, czy GET, czy POST, otrzymuję błąd 404. Jeśli po prostu wprowadzę adres URL Web API w przeglądarce (IE 9 otwarty lokalnie na serwerze), aby uruchomić żądanie GET, otrzymuję stronę 404. Jeśli wydam żądanie POST z aplikacji klienckiej Web API, otrzymam również 404 i komunikat:
Nie znaleziono zasobu HTTP zgodnego z identyfikatorem URI żądania
Stworzyłem stronę testową z MVC 4 i Web API, a także wdrożyłem ją na tym samym serwerze i działa Web API. Web API i zestawy MVC mają ten sam numer wersji w obu projektach.
Ponadto dodałemWeb API Route Debugger do aplikacji. Jeśli korzystam z prawidłowej trasy, jakhttp://myserver/api/order/12
Otrzymuję następujący wynik:
Dla mnie oznacza to poprawny szablon trasyApi/{Controller}/{Id}
został znaleziony i poprawnie przeanalizowany w kontrolerzeOrder
iId=12
. Kontroler (wyprowadzony zApiController
) istnieje w zespole WWW, w którym znajdują się również wszystkie kontrolery MVC.
Nie wiem jednak, jaki jest status000
może oznaczać i dlaczego nie jest wyświetlana sekcja „Wybór trasy” (co zwykle ma miejsce nawet wtedy, gdy zespół nie zawiera pojedynczego fragmentu)ApiController
, zobacz zrzuty ekranu na powyższej stronie z linkami. Wygląda na to, że nieApiController
zostanie znalezione lub nawet nie wyszukane lub wyszukiwanie zakończy się niepowodzeniem.
Pliki dziennika IIS nie pokazują niczego użytecznego. Zmiana różnych ustawień puli aplikacji i użycie tej samej puli aplikacji dla testu i rzeczywistej aplikacji nie pomogło.
Obecnie jestem w trakcie usuwania z aplikacji „funkcji”, ustawień konfiguracji, zespołów innych firm itp., Aby w końcu sprowadzić je do niewielkiego rozmiaru aplikacji testowej i mieć nadzieję, że w pewnym momencie zacznie działać.
Czy ktoś ma pojęcie, czym może być ten problem? Również każdy pomysł na debugowanie lub rejestrowanie, aby znaleźć przyczynę, jest bardzo mile widziany.
Edytować
Dzięki wskazówkom Darrela Millera w komentarzach poniżej zintegrowałemŚledzenie dla ASP.NET Web Api.
Dla adresu URL żądania (GET)http://myserver/api/order/12
Otrzymuję następujące informacje:
Wiadomość:http://localhost:50020/api/order/12
; Kategoria: System.Web.Http.Request
Wybór kontrolera i instancja ...
Operator: DefaultHttpControllerSelector; Działanie: SelectController; Wiadomość: Route = "controller: order, id: 12"; Kategoria: System.Web.Http.Controllers
Operator: DefaultHttpControllerSelector; Działanie: SelectController; Wiadomość: Zamówienie; Kategoria: System.Web.Http.Controllers
Operator: HttpControllerDescriptor; Operacja: CreateController; Wiadomość:; Kategoria: System.Web.Http.Controllers
Operator: DefaultHttpControllerActivator; Operacja: Utwórz; Wiadomość:; Kategoria: System.Web.Http.Controllers
Operator: DefaultHttpControllerActivator; Operacja: Utwórz; Komunikat: MyApplication.ApiControllers.OrderController; Kategoria: System.Web.Http.Controllers
Wybór akcji, powiązanie parametrów i wywołanie akcji następuje ...
Negocjacja treści i formatowanie wyników ...
Operator: DefaultContentNegotiator; Operacja: Negocjuj; Wiadomość: Typ = „String” ...więcej
Usuwanie kontrolera ...
Operator: OrderController; Operacja: Usuń; Wiadomość:; Kategoria: System.Web.Http.Controllers
W środowisku produkcyjnym nie powiodło się (w skrócie):Wiadomość:http://myserver/api/order/12
; Kategoria: System.Web.Http.Request
Operator: DefaultHttpControllerSelector; Działanie: SelectController; Wiadomość: Route = "controller: order, id: 12"; Kategoria: System.Web.Http.Controllers
Brakuje całej części aktywacji kontrolera, wyboru działania, powiązania parametrów, wywołania akcji i następuje natychmiastowa negocjacja treści i formatowanie komunikatu o błędzie:
Operator: DefaultContentNegotiator; Operacja: Negocjuj; Wiadomość: Type = "HttpError" ...więcej