이 기사에 쓰여진 모든 것을 시도했습니다 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api . angularJS를 사용하여 다른 도메인에서 사용하기 위해 webAPI2 (MVC5)에서 데이터를 가져 오려고합니다.
내 컨트롤러는 다음과 같습니다.
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
답변
Web Api 에서 CORS 를 활성화해야합니다 . CORS를 전역 적으로 활성화하는 더 쉽고 선호되는 방법은 web.config에 다음을 추가하는 것입니다.
<system.webServer>
<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" />
</customHeaders>
</httpProtocol>
</system.webServer>
것을 바랍니다 노트 방법은 모두 개별적으로 사용하는 대신, 지정됩니다 *
. 을 (를) 사용할 때 발생하는 버그가 있기 때문입니다 *
.
코드로 CORS 를 활성화 할 수도 있습니다 .
업데이트
다음 NuGet 패키지가 필요합니다 Microsoft.AspNet.WebApi.Cors
..
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors();
// ...
}
}
그런 다음 다음 [EnableCors]
과 같이 Actions 또는 Controllers에 속성을 사용할 수 있습니다.
[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
또는 전 세계적으로 등록 할 수 있습니다.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
config.EnableCors(cors);
// ...
}
}
또한 Options
요청 으로 프리 플라이트 요청 을 처리해야 HTTP OPTIONS
합니다.
Web API
을 ( Options
를) 지원하도록 구성되었는지 확인하기 위해 요청에 응답해야합니다 CORS
.
이를 처리하기 위해 필요한 것은 빈 응답을 다시 보내는 것 입니다. 작업 내에서이를 수행하거나 다음과 같이 전역 적으로 수행 할 수 있습니다.
# Global.asax.cs
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
이 추가 검사는 오래된 보장하기 위해 추가되었습니다 APIs
만 수용하도록 설계되었다 그 GET
와 POST
요청이 악용 할 수 없습니다 것이다. 이 동사 가 존재하지 않았을 때 설계자에게 DELETE
요청을 보내는 것을 상상해보십시오 . 결과는 예측할 수 없으며 결과는 위험 할 수 있습니다 .API
답변
@ Mihai-Andrei Dinculescu의 대답은 정확하지만 검색 자의 이익을 위해이 오류를 일으킬 수있는 미묘한 점도 있습니다.
URL 끝에 ‘/’를 추가하면 모든 인스턴스 (예 : 홈페이지에서)에서 EnableCors가 작동하지 않습니다.
즉 이것은 작동하지 않습니다
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);
그러나 이것은 작동합니다.
var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);
EnableCors 속성을 사용하는 경우 효과는 동일합니다.
답변
나는 Mihai-Andrei Dinculescu가 지시 한 위의 모든 단계를 따랐습니다 .
그러나 제 경우 에는 Web.Config에서 http OPTIONS가 아래 줄에 비활성화되어 있기 때문에 한 단계 더 필요했습니다 .
<remove name="OPTIONSVerbHandler" />
방금 Web.Config에서 제거했으며 (아래처럼 주석 처리) Cors는 매력처럼 작동합니다.
<handlers>
<!-- remove name="OPTIONSVerbHandler" / -->
</handlers>
답변
Cors nuget 패키지 설치 때문일 수 있습니다.
nuget에서 cors를 설치하고 enabaling 한 후 문제가 발생하면 web Api를 다시 설치해보세요.
패키지 관리자에서 다음을 실행하십시오. Update-Package Microsoft.AspNet.WebApi -reinstall
답변
CORS를 올바르게 구성했는지 확인하려면 다음을 시도하십시오.
[EnableCors(origins: "*", headers: "*", methods: "*")]
그래도 작동이 안되는? HTTP 헤더가 있는지 확인하십시오.
답변
CORS 프로토콜이 작동하도록하려면 해당 헤더를 반환 할 모든 엔드 포인트 (또는이 메서드가있는 전역 필터)에 OPTIONS 메서드가 있어야합니다.
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type
그 이유는 브라우저가 먼저 OPTIONS 요청을 보내 서버를 ‘테스트’하고 인증을 확인하기 때문입니다.
답변
cors에 대한 다음 사건을 잡았습니다. 누군가에게 유용 할 수도 있습니다. ‘WebDav Redirector’기능을 서버에 추가하면 PUT 및 DELETE 요청이 실패합니다.
따라서 IIS 서버에서 ‘WebDAVModule’을 제거해야합니다.
- “IIS 모듈 구성에서 WebDAVModule을 반복합니다. 웹 서버에 있으면 제거하십시오.”
또는 구성에 추가하십시오.
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
...
</handlers>