.NET Core API CORS 의 실현
GET/POST 요청
서버 에서 어떠한 조정 도 하지 않 은 상태 에서 전단 에서 AJAX 요청 을 합 니 다.예 를 들 어:
$.ajax({
type: 'get',
url: 'http://localhost:5000',
success: function (result) {
$('#result').html(result);
}
});
200 !!!멀쩡 한 것 같 아 요.괜 찮 은 것 같 아 요.그러나 Response 에 아무것도 없 는 것 을 발견 하고 브 라 우 저 Console 로 돌아 가 보면 잘못된 정보 가 있 습 니 다.크로스 도 메 인 접근 이 지원 되 지 않 고 시원 하 다 는 것 을 알려 줍 니 다.
JSONP
크로스 도 메 인 문 제 를 만 났 을 때 JSONP 의 해결 방식 을 쉽게 생각 할 수 있 지만 GET 요청 에 국한 되 고 POST 가 어렵다 고 해서 저도 사용 하지 않 았 습 니 다.여 기 는 테스트 하지 않 겠 습 니 다.
$.ajax({
type: 'get',
url: 'http://localhost:5000/home/jsonpTest',
data: {
name: 'beck'
},
dataType: "jsonp",
jsonpCallback: "jsonpCallback",
success: function (result) {
$('#result').html(result.Data);
}
});
그럼 이제 문제 가 생 겼 습 니 다.JSONP 와 GET 의 요청 은 자신의 제한 이 있 기 때문에 POST 를 굳이 필요 로 한다 면 어떻게 합 니까?그럼 CORS 를 선택 하 세 요!
CORS
CORS(Cross-Origin Resource Sharing,크로스 소스 자원 공유)는 W3C 에서 나 온 표준 으로 사용자 정의 HTTP 헤드 를 사용 하여 브 라 우 저 를 서버 와 소통 시 켜 요청 이나 응답 이 성공 해 야 하 는 지,실패 해 야 하 는 지 를 결정 하 는 것 이 사상 이다.CORS 와 JSONP 는 크로스 소스 자원 공 유 를 할 수 있 지만 JSONP 와 달리 CORS 는 GET 방식 을 제외 한 모든 유형의 HTTP 요청 을 지원 할 수 있다.
실현 방식 을 소개 하기 전에 먼저 일부 CORS 와 관련 된 이론 을 간단하게 알 아야 한다.그렇지 않 으 면 문제 에 대해 약간 어리둥절 할 수 있다.특히 그 중의 OPTIONS 요청 은 GET,POST 방식 으로 설정 되 어 있 는데 어떻게 OPTIONS 요청 이 하나 더 나 올 수 있 습 니까?
CORS 요청 은 간단 한 요청 과 복잡 한 요청 으로 나 뉜 다.
간단 한 요청
동시에 다음 조건 을 만족 시 키 는 것 은 간단 한 요구 로 분류 된다.
public void ConfigureServices(IServiceCollection services)
{
//
services.AddCors();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// , http://localhost:53894
app.UseCors(options => options.WithOrigins("http://localhost:53894"));
}
전단 에서 GET 또는 POST 요청:
$.ajax({
type: 'post',
url: 'http://localhost:5000/home/fromFormTest',
data: {
name: 'beck'
},
success: function (result) {
$('#result').html(result.data);
}
});
복잡 한 요구
간단 한 요청 조건 을 충족 하지 못 하 는 일괄 적 인 요 구 는 복잡 한 요청 으로 분류 되 며,복잡 한 요 구 는 정식 통신 에 앞서 OPTIONS 요청 을 한 번 추가 해'예 찰'요청 이 라 고 하 며,예 찰 요청 의 반환 헤더 정 보 를 통 해 현재 요청 이 허용 되 는 지 여 부 를 판단 한다.
contentType 을 application/json 으로 설정 할 수 있 습 니 다.이 요청 은 복잡 한 요청 이 됩 니 다.
$.ajax({
type: 'post',
url: 'http://localhost:5000/home/fromBodyTest',
contentType: 'application/json',
data: JSON.stringify({
name: 'beck'
}),
success: function (result) {
$('#result').html(result.data);
}
});
API 프로젝트 의 Startup.cs 가 위 에서 조정 한 후에 변 하지 않 으 면 OPTIONS 요청 에서 Response Headers 정보 가 요청 을 허용 하 는 원본 주소 인 Access-Control-Allow-Origin 이 나타 나 지 않 는 것 을 볼 수 있 습 니 다.이 는 예비 검사 가 실 패 했 음 을 의미 하 며 계속 차 갑 게 식 혀 있 습 니 다.예 검 요청 의 반환 헤더 에 Access-Control-Request-Method 와 Access-Control-Request-Headers 를 설정 해 야 하기 때문이다.app.UseCors 는 일부 헤더 정보 나 요청 형식 을 설정 하 는 것 을 지원 합 니 다.이 는 사용 할 때 실제 상황 을 보고 결정 합 니 다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 、 、
app.UseCors(options => options
.WithOrigins("http://localhost:53894")
.AllowAnyHeader()
.AllowAnyMethod()
);
}
예비 검사 통과 후 POST 요청:
Cookie
서버 에 쿠키 를 휴대 할 것 을 요청 하면 다음 과 같이 약간의 조정 이 필요 합 니 다.
Startup.cs AllowCredentials 설정 추가:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 、 、 、Cookie
app.UseCors(options => options
.WithOrigins("http://localhost:53894")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
}
AJAX 요청 에 도 withCredentials 설정 을 추가 해 야 합 니 다.
setCookie('name', 'test');
$.ajax({
type: 'post',
url: 'http://localhost:5000/home/fromBodyTest',
contentType: 'application/json',
data: JSON.stringify({
name: 'beck'
}),
xhrFields: {
withCredentials: true
},
success: function (result) {
$('#result').html(result.data);
}
});
상기 코드 의 간단 한 수정 을 통 해 CORS 가 실현 되 었 다.실제 내부 네트워크 나 생산 환경 에 서 는 운영 차원 에서 Nginx 나 다른 설정 을 통 해 코드 를 수정 하지 않 아 도 완벽 하 게 지원 할 수 있 습 니 다.참고 자료
ASP.NET Core CORS
CORSSample
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다. 아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다. 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.