클라이언트 측에서 AngularJS $ http를 사용하여 서버 측에서 ASP.NET 웹 API 애플리케이션의 끝점에 액세스하고 있습니다. 클라이언트가 서버와 다른 도메인에서 호스팅되므로 CORS가 필요합니다. $ http.post (url, data)에서 작동합니다. 하지만 사용자를 인증하고 $ http.get (url)을 통해 요청하자마자 메시지가 나타납니다.
'Access-Control-Allow-Origin'헤더에는 'http://127.0.0.1:9000, http://127.0.0.1:9000'값이 여러 개 포함되어 있지만 하나만 허용됩니다. 따라서 원본 'http://127.0.0.1:9000'은 액세스가 허용되지 않습니다.
Fiddler는 성공적인 옵션 요청 후 get 요청에 실제로 두 개의 헤더 항목이 있음을 보여줍니다. 내가 무엇을 어디에서 잘못하고 있습니까?
최신 정보
$ http.get 대신 jQuery $ .get을 사용하면 동일한 오류 메시지가 나타납니다. 따라서 이것은 AngularJS에 문제가없는 것 같습니다. 그러나 그것이 잘못된 곳은 어디입니까?
답변
나는 추가했다
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
만큼 잘
app.UseCors(CorsOptions.AllowAll);
서버에서. 결과적으로 두 개의 헤더 항목이 생성됩니다. 후자를 사용하면 작동합니다.
답변
모범 사례 (예 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) 에 따라 CORS를 설정했기 때문에이 문제가 발생했습니다. 또한 <add name="Access-Control-Allow-Origin" value="*"/>
web.config에 사용자 지정 헤더 가 있습니다.
web.config 항목을 제거하면 모두 정상입니다.
@mww의 답변과는 달리 EnableCors()
WebApiConfig.cs 및 EnableCorsAttribute
컨트롤러에 여전히 있습니다 . 둘 중 하나를 꺼냈을 때 다른 문제가 발생했습니다.
답변
나는 Cors 5.1.0.0을 사용하고 있는데, 많은 두통 끝에 서버의 Access-Control-Allow-Origin & Access-Control-Allow-Header 헤더가 중복되는 문제를 발견했습니다.
config.EnableCors()
WebApiConfig.cs 파일에서 제거 되었으며 [EnableCors("*","*","*")]
Controller 클래스에 속성 만 설정했습니다.
답변
WebApiConfig 등록에 추가
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
또는 web.config
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
하지만 둘 다 아닙니다
답변
실제로 여러 헤더를 설정할 수 없습니다 Access-Control-Allow-Origin
(또는 적어도 모든 브라우저에서 작동하지는 않습니다). 대신 환경 변수를 조건부로 설정 한 다음 Header
지시문 에서 사용할 수 있습니다 .
SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
따라서이 예제에서 응답 헤더는 요청 헤더 Origin
가 RegExp :와 일치 하는 경우에만 추가됩니다 ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$
(기본적으로 HTTP 또는 HTTPS를 통한 localhost 및 HTTPS를 통한 * .my.base.domain을 의미 함).
setenvif
모듈 을 활성화하는 것을 잊지 마십시오 .
문서 :
- http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif
- http://httpd.apache.org/docs/2.2/mod/mod_headers.html#header
BTW. }e
에서는 %{ORIGIN_SUB_DOMAIN}e
오타가 아닙니다. Header
디렉티브 에서 환경 변수를 사용하는 방법 입니다.
답변
나도 OWIN과 WebAPI를 모두 가지고 있었는데 둘 다 CORS를 별도로 활성화해야했기 때문에 'Access-Control-Allow-Origin' header contains multiple values
오류가 발생했습니다.
CORS를 활성화 한 모든 코드를 제거한 다음 system.webServer
Web.Config 의 노드에 다음을 추가했습니다 .
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
</customHeaders>
</httpProtocol>
이렇게하면 OWIN (로그인 허용) 및 WebAPI (API 호출 허용)에 대한 CORS 요구 사항이 충족되었지만 새로운 문제가 발생했습니다. OPTIONS
API 호출을위한 프리 플라이트 중에 메서드를 찾을 수 없습니다. 이에 대한 수정은 간단했습니다 handlers
. Web.Config 노드 에서 다음을 제거하면됩니다 .
<remove name="OPTIONSVerbHandler" />
이것이 누군가를 돕기를 바랍니다.
답변
Apache 서버 :
나는 똑같이 지출하지만, 서버에 대한 액세스를 제공 한 파일에 별표 ( “)가 없었기 때문입니다 (예 : ‘.htaccess.’).
Header add Access-Control-Allow-Origin: *
Header add Access-Control-Allow-Origin "*"
다른 ‘.htaccess’가있는 폴더에 ‘.htaccess’파일이있을 수도 있습니다.
/
- .htaccess
- public_html / .htaccess (problem here)
귀하의 경우 ‘*’대신 별표는 http://127.0.0.1:9000
데이터 제공 권한을 부여 하는 ip ( ) 서버입니다.
ASP.NET :
코드에 ‘Access-Control-Allow-Origin’중복이 없는지 확인하십시오.
개발자 도구:
Chrome을 사용하면 요청 헤더를 확인할 수 있습니다. F12 키를 누르고 ‘네트워크’탭으로 이동하여 이제 AJAX 요청을 실행하고 목록에 표시되고 클릭하여 모든 정보를 제공합니다.