Pracuję z ASP.NET MVC 4 WebApi i świetnie się bawię, uruchamiając go na moim lokalnym komputerze w IIS Express. Skonfigurowałem IIS Express do obsługi komputerów zdalnych, więc inni w mojej firmie używają mojego komputera jako naszego serwera internetowego.
Po uznaniu, że nie jest to optymalne rozwiązanie, zdecydowaliśmy się umieścić WebApi na zdalnym serwerze po zainstalowaniu .NET 4.5. Kiedy używam fiddlera i wysyłam POST do kontrolera na mojej lokalnej maszynie, zwraca poprawną odpowiedź, ale kiedy zmieniam domenę na serwer sieciowy z IIS7, ten sam POST zwraca tajemniczy
{"message": "wystąpił błąd"}
wiadomość. Czy ktoś ma pojęcie, co może się dziać?
Odpowiedzi:
Problem polegał na braku zależności, której nie było na serwerze, ale na moim komputerze lokalnym. W naszym przypadku był to plik dll Devart.Data.Linq.
Aby uzyskać tę odpowiedź, włączyłem śledzenie IIS dla 500 błędów. To dało trochę informacji, ale naprawdę pomocne było ustawienie w pliku web.config
<system.web><customErrors mode="Off"/></system.web>
To wskazało na brakującą zależność ładowaną dynamicznie. Po dodaniu tej zależności i poleceniu jej lokalnego skopiowania serwer zaczął działać.źródło
mode="RemoteOnly"
a jeśli uruchomisz stronę w przeglądarce internetowej na serwerze, zobaczysz również błędy bez narażania bezpieczeństwa, jeśli reszta witryny jest dostępna z zewnątrzGruntownie:
Użyj
IncludeErrorDetailPolicy
zamiast tego, jeśliCustomErrors
nie rozwiąże tego za Ciebie (np. Jeśli jesteś stosem ASP.NET> 2012):Uwaga: bądź ostrożny, zwracając szczegółowe informacje o błędzie, może ujawnić poufne informacje „hakerom”. Zobacz komentarz Simona do tej odpowiedzi poniżej.
Wersja TL; DR
Mnie
CustomErrors
nie pomogło. Było już ustawioneOff
, ale nadal otrzymałem tylko marnąan error has occurred
wiadomość. Wydaje mi się, że przyjęta odpowiedź pochodzi z okresu sprzed 3 lat, co w dzisiejszych czasach jest od dawna. Używam Web API 2 i ASP.NET 5 (MVC 5), a Microsoft odszedł od strategiiCustomErrors
opartej tylko na IIS, podczas gdy jest old skool IIS;).W każdym razie miałem problem z produkcją, którego nie miałem lokalnie. A potem stwierdziłem, że nie widzę błędów na karcie Sieć w Chrome, tak jak na moim komputerze deweloperskim. W końcu udało mi się go rozwiązać, instalując Chrome na moim serwerze produkcyjnym, a następnie przeglądając aplikację na samym serwerze (np. Na „localhost”). Następnie pojawiły się bardziej szczegółowe błędy ze śladami stosu i wszystkim.
Dopiero potem znalazłem ten artykuł od Jimmy'ego Bogarda (Uwaga: Jimmy to pan AutoMapper! ). Zabawne jest to, że jego artykuł jest również z 2012 roku, ale w nim już wyjaśnia, że
CustomErrors
to już nie pomaga, ale MOŻESZ zmienić 'Szczegóły błędu', ustawiając innąIncludeErrorDetailPolicy
w globalnej konfiguracji WebApi (np.WebApiConfig.cs
):Na szczęście wyjaśnia również, jak to skonfigurować, że webapi (2) SŁUCHA twoich
CustomErrors
ustawień. To całkiem rozsądne podejście, które pozwala wrócić do 2012 roku: P.Uwaga: Wartość domyślna to „LocalOnly”, co wyjaśnia, dlaczego udało mi się rozwiązać problem w sposób opisany przeze mnie przed znalezieniem tego wpisu. Ale rozumiem, że nie każdy może po prostu zdalnie sterować produkcją i uruchamiać przeglądarkę (wiem, że przeważnie nie mogłem, dopóki nie zdecydowałem się przejść na freelancera i DevOps).
źródło
if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }
aby ustawić taką opcję. Następnie mogę przetestować go w środowisku produkcyjnym, a jutro w magiczny sposób powróci do normalnego zachowania, jeśli zapomnę go wyłączyć.Żadna z pozostałych odpowiedzi nie działała dla mnie.
To zrobiło: (w Startup.cs)
(lub możesz umieścić go w WebApiConfig.cs):
źródło
Zawsze dochodzę do tego pytania, gdy napotykam błąd w środowisku testowym i przypominam sobie: „Robiłem to już wcześniej, ale mogę to zrobić bezpośrednio w pliku web.config bez konieczności modyfikowania kodu i ponownego wdrażania w środowisku testowym , ale wymaga 2 zmian ... co to było znowu? ”
Dla przyszłego odniesienia
I
źródło
Miałem podobny problem podczas wysyłania do punktu końcowego WebAPI. Wyłączając CustomErrors = Off, mogłem zobaczyć rzeczywisty błąd, który jest jednym z brakujących bibliotek dll.
źródło
Na wypadek, gdyby to komuś pomogło:
Miałem podobny problem i zgodnie z instrukcjami Natesa dodałem:
To pokazało mi więcej informacji o błędzie:
Wtedy przypomniałem sobie, że przeniosłem plik edmx do innej lokalizacji i zapomniałem zmienić węzeł connectionstrings w konfiguracji (węzeł connectionstrings został umieszczony w osobnym pliku przy użyciu „configSource”, ale to już inna historia).
źródło
Mój plik Swagger XML nie został wdrożony w \ bin:
http://wmpratt.com/swagger-and-asp-net-web-api-part-1/
Musiało być ustawione w konfiguracji wydania, a także w konfiguracji debugowania.
źródło
Jeśli masz
<deployment retail="true"/>
plik machine.config w programie .NET Framework, nie zobaczysz szczegółowych komunikatów o błędach. Upewnij się, że ustawienie jest fałszywe lub nie istnieje.źródło
Więc bezskutecznie wypróbowałem wszystkie sugerowane rozwiązania. Wszystko, co zrobiłem, to ustawić uruchamianie aplikacji z serwera i wyświetlał błąd w całości. Powinno to zadziałać, gdy ustawiłem tryb customErrors na false, ale tak się nie stało. W momencie, gdy przeglądałem API z serwera, mogłem zobaczyć problem.
źródło