Używam AngularJS $ http po stronie klienta, aby uzyskać dostęp do punktu końcowego aplikacji ASP.NET Web API po stronie serwera. Ponieważ klient jest hostowany w innej domenie niż serwer, potrzebuję CORS. Działa dla $ http.post (url, dane). Ale jak tylko uwierzytelnię użytkownika i wyślę żądanie za pośrednictwem $ http.get (url), otrzymuję wiadomość
Nagłówek „Access-Control-Allow-Origin” zawiera wiele wartości „http://127.0.0.1:9000, http://127.0.0.1:9000”, ale dozwolona jest tylko jedna. Dlatego Origin „http://127.0.0.1:9000” nie ma dostępu.
Fiddler pokazuje mi, że rzeczywiście istnieją dwa wpisy nagłówka w żądaniu get po pomyślnym żądaniu opcji. Co i gdzie robię coś złego?
Aktualizacja
Kiedy używam jQuery $ .get zamiast $ http.get, pojawia się ten sam komunikat o błędzie. Więc wydaje się, że nie ma problemu z AngularJS. Ale gdzie jest źle?
asp.net-web-api
cors
angularjs-http
Papa Mufflon
źródło
źródło
Odpowiedzi:
dodałem
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
jak również
app.UseCors(CorsOptions.AllowAll);
na serwerze. Powoduje to dwa wpisy nagłówka. Po prostu użyj tego drugiego i działa.
źródło
Napotkaliśmy ten problem, ponieważ skonfigurowaliśmy CORS zgodnie z najlepszymi praktykami (np. Http://www.asp.net/web-api/overview/security/eniring-cross-origin-requests-in-web-api ) ORAZ RÓWNIEŻ miał niestandardowy nagłówek
<add name="Access-Control-Allow-Origin" value="*"/>
w web.config.Usuń wpis web.config i wszystko jest w porządku.
Wbrew odpowiedzi @ mww nadal mamy
EnableCors()
w WebApiConfig.cs ORAZEnableCorsAttribute
na kontrolerze. Kiedy wyjęliśmy jeden lub drugi, napotkaliśmy inne problemy.źródło
Używam Cors 5.1.0.0, po wielu bólach głowy odkryłem, że problem jest zduplikowany w nagłówkach Access-Control-Allow-Origin i Access-Control-Allow-Header z serwera
Usunięto
config.EnableCors()
z pliku WebApiConfig.cs i po prostu ustawiono[EnableCors("*","*","*")]
atrybut w klasie ControllerSprawdzić ten artykuł , aby uzyskać więcej szczegółów.
źródło
Dodaj, aby zarejestrować WebApiConfig
Lub web.config
ALE NIE OBA
źródło
W rzeczywistości nie możesz ustawić wielu nagłówków
Access-Control-Allow-Origin
(a przynajmniej nie będzie działać we wszystkich przeglądarkach). Zamiast tego możesz warunkowo ustawić zmienną środowiskową, a następnie użyć jej wHeader
dyrektywie:W tym przykładzie nagłówek odpowiedzi zostanie dodany tylko wtedy, gdy nagłówek żądania jest
Origin
zgodny z RegExp:^(https?://localhost|https://[a-z]+\.my\.base\.domain)$
(zasadniczo oznacza to localhost przez HTTP lub HTTPS i * .my.base.domain przez HTTPS).Pamiętaj, aby włączyć
setenvif
moduł.Dokumenty:
BTW.
}e
W%{ORIGIN_SUB_DOMAIN}e
nie jest literówka. Tak używasz zmiennej środowiskowej wHeader
dyrektywie.źródło
Ja również miałem zarówno OWIN, jak i moje WebAPI, które najwyraźniej wymagały osobnego włączenia CORS, co z kolei spowodowało
'Access-Control-Allow-Origin' header contains multiple values
błąd.Skończyło się na usunięciu CAŁEGO kodu, który włączał CORS, a następnie dodałem następujący element do
system.webServer
węzła mojego Web.Config:Spowodowało to spełnienie wymagań CORS dla OWIN (zezwalające na logowanie) i dla WebAPI (zezwalające na wywołania API), ale stworzyło nowy problem:
OPTIONS
nie można było znaleźć metody podczas inspekcji wstępnej dla moich wywołań API. Rozwiązanie tego problemu było proste - wystarczyło usunąć następujące elementy zhandlers
węzła my Web.Config:Mam nadzieję, że to komuś pomoże.
źródło
Serwer Apache:
Wydałem tyle samo, ale to dlatego, że nie miałem cudzysłowu (") gwiazdki w moim pliku, która zapewniała dostęp do serwera, np. '.Htaccess.':
Możesz również mieć plik „.htaccess” w folderze z innym plikiem „.htaccess”, np
W twoim przypadku zamiast gwiazdki „*” oznaczałby
http://127.0.0.1:9000
serwer ip ( ), któremu zezwalasz na udostępnianie danych.ASP.NET:
Sprawdź, czy w Twoim kodzie nie ma duplikatu „Access-Control-Allow-Origin”.
Narzędzia deweloperskie:
W Chrome możesz zweryfikować nagłówki żądań. Naciśnij klawisz F12 i przejdź do zakładki 'Sieć', teraz uruchom żądanie AJAX i pojawi się na liście, kliknij i podaj wszystkie informacje tam.
źródło
Dzieje się tak, gdy masz opcję Cors skonfigurowaną w wielu lokalizacjach. W moim przypadku miałem to na poziomie kontrolera, a także w Startup.Auth.cs / ConfigureAuth.
Rozumiem, że jeśli chcesz, aby aplikacja była szeroka, po prostu skonfiguruj ją w Startup.Auth.cs / ConfigureAuth w ten sposób ... Będziesz potrzebować odniesienia do Microsoft.Owin.Cors
Jeśli wolisz zachować go na poziomie kontrolera, możesz po prostu wstawić na poziomie kontrolera.
źródło
jeśli jesteś w IIS, musisz aktywować CORS w web.config, to nie musisz włączać metody App_Start / WebApiConfig.cs Register
Moim rozwiązaniem było, skomentował linie tutaj:
i napisz w web.config:
źródło
Może się to oczywiście zdarzyć, jeśli faktycznie ustawisz
Access-Control-Allow-Origin
nagłówek tak, aby miał wiele wartości - na przykład lista wartości oddzielonych przecinkami, która jest w pewnym sensie obsługiwana w RFC, ale w rzeczywistości nie jest obsługiwana przez większość głównych przeglądarek. Zwróć uwagę, że dokument RFC mówi o tym, jak zezwolić na więcej niż jedną domenę bez używania „*”.Na przykład możesz uzyskać ten błąd w Chrome, używając takiego nagłówka:
Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com
To było w
Chrome Version 64.0.3282.186 (Official Build) (64-bit)
Zauważ, że jeśli rozważasz to ze względu na CDN i używasz Akamai, możesz zauważyć, że Akamai nie będzie buforował pamięci na serwerze, jeśli używasz
Vary:Origin
, sposób, w jaki wielu sugeruje rozwiązanie tego problemu.Prawdopodobnie będziesz musiał zmienić sposób budowania klucza pamięci podręcznej, używając zachowania odpowiedzi „Modyfikacja identyfikatora pamięci podręcznej”. Więcej szczegółów na ten temat w tym pokrewnym pytaniu dotyczącym StackOverflow
źródło
Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com
. To byłby właściwy sposób, ale przeglądarki nie przestrzegają tutaj standardu ( źródło ).Tak głupie i proste:
Ten problem wystąpił podczas dwukrotnego przebywania
Header always set Access-Control-Allow-Origin *
w moim pliku konfiguracyjnym Apache. Raz zVirtualHost
tagami i raz wewnątrzLimit
tagu:Usunięcie jednego wpisu rozwiązało problem.
Myślę, że w oryginalnym poście byłoby to dwa razy:
źródło
właśnie miałem ten problem z serwerem nodejs.
oto jak to naprawiłem.
Uruchomiłem serwer węzłów przez
nginx proxy
a i ustawiłem nginx inode
obaallow cross domain requests
i nie podobało mi się to, więc usunąłem go z nginx i zostawiłem w węźle i wszystko było dobrze.źródło
rack-cors
klejnotowi obsługiwać elementy CORS. Bam, naprawione.Napotkałem ten sam problem i oto, co zrobiłem, aby go rozwiązać:
W serwisie WebApi wewnątrz Global.asax napisałem następujący kod:
Tutaj ten kod zezwala tylko na żądanie przed lotem i tokenem, aby dodać „Access-Control-Allow-Origin” w odpowiedzi, w przeciwnym razie nie dodam go.
Oto mój blog dotyczący wdrożenia: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /
źródło
dla tych, którzy używają IIS z php, na serwerze IIS it zaktualizuj plik web.config do katalogu głównego (wwwroot) i dodaj to
po tym zrestartuj serwer IIS, wpisz IISReset w RUN i wprowadź
źródło
Oto inne wystąpienie podobne do powyższych przykładów, że możesz mieć tylko jeden plik konfiguracyjny definiujący miejsce CORS: Na serwerze IIS znajdowały się dwa pliki web.config w ścieżce w różnych katalogach, a jeden z nich był ukryty w katalogu wirtualnym. Aby rozwiązać ten problem, usunąłem plik konfiguracyjny poziomu głównego, ponieważ ścieżka używała pliku konfiguracyjnego w katalogu wirtualnym. Musisz wybrać jedną lub drugą.
źródło
Nagłówek „Access-Control-Allow-Origin” zawiera wiele wartości
kiedy otrzymałem ten błąd, spędziłem mnóstwo godzin na szukaniu rozwiązania tego problemu, ale nic nie działa, w końcu znalazłem rozwiązanie tego problemu, które jest bardzo proste. gdy nagłówek `` Access-Control-Allow-Origin '' został dodany więcej niż jeden raz do Twojej odpowiedzi, ten błąd występuje, sprawdź swój apache.conf lub httpd.conf (serwer Apache), skrypt po stronie serwera i usuń niechciany nagłówek wpisu z tych plików .
źródło