[C#] MVC 웹 API : 요청 된 리소스에 ‘Access-Control-Allow-Origin’헤더가 없습니다.

이 기사에 쓰여진 모든 것을 시도했습니다 : 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만 수용하도록 설계되었다 그 GETPOST요청이 악용 할 수 없습니다 것이다. 이 동사 가 존재하지 않았을 때 설계자에게 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>