[javascript] IIS7에서 교차 출처 리소스 공유 활성화

최근에 다른 도메인에 Javascript 요청을 게시했습니다. 기본적으로 다른 도메인에 대한 XHR 게시는 허용되지 않습니다.

http://enable-cors.org/ 의 지침 에 따라 다른 도메인에서이를 활성화했습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
    </customHeaders>
  </httpProtocol>
 </system.webServer>
</configuration>

여기에 이미지 설명 입력

이제 모든 것이 잘 작동하지만 작동하는 200 응답을 다시 보내기 전에 여전히 405 응답을 반환합니다.

Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

업데이트 : 2014 년 3 월 2 일

MSDN 매거진에 최근 업데이트 된 기사가 있습니다. ASP.NET Web API 2에서 CORS 지원을 자세히 설명합니다.

http://msdn.microsoft.com/en-us/magazine/dn532203.aspx



답변

응용 프로그램에서 HTTP OPTIONS 응답을 지정하는 대신 IIS 7에서 HTTP OPTIONS 응답을 ‘처리’하는 경우 일 수 있습니다. 이를 확인하려면 IIS7에서

  1. 사이트의 처리기 매핑으로 이동합니다.

  2. ‘OPTIONSVerbHandler’까지 아래로 스크롤합니다.

  3. ‘ProtocolSupportModule’을 ‘IsapiHandler’로 변경합니다.

  4. 실행 파일 설정 : % windir % \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll

이제 위의 구성 항목은 HTTP OPTIONS 동사가 전송 될 때 시작됩니다.

또는 BeginRequest 메서드에서 HTTP OPTIONS 동사에 응답 할 수 있습니다.

    protected void Application_BeginRequest(object sender,EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

        if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
            HttpContext.Current.Response.End();
        }

    }


답변

댓글을 달 수 없어서 별도의 답변에 넣어야하는데 샤가 받아 준 답변과 관련이 있습니다.

처음에는 IIS에서 OPTIONSVerbHandler를 다시 구성하여 Shahs 답변 (감사합니다!)을 따랐지만 응용 프로그램을 다시 배포 할 때 설정이 복원되었습니다.

대신 Web.config에서 OPTIONSVerbHandler를 제거했습니다.

<handlers>
    <remove name="OPTIONSVerbHandler"/>
</handlers>


답변

http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html 에있는 정보 가 IIS 7에서 WCF 서비스에 대한 HTTP 옵션을 설정하는 데 매우 유용 하다는 것을 알았 습니다.

web.config에 다음을 추가 한 다음 IIS 7 ‘핸더 매핑’목록의 OPTIONSVerbHandler를 목록의 맨 위로 이동했습니다. 또한 핸들러 매핑 섹션에서 처리기를 두 번 클릭 한 다음 ‘요청 제한’을 클릭 한 다음 액세스 탭을 클릭하여 OPTIONSVerbHander에 읽기 액세스 권한을 부여했습니다.

불행히도 IE는 XDomainRequest 객체에 헤더 추가 (Content-Type을 text / xml로 설정하고 SOAPAction 헤더 추가) 를 지원하지 않는 것 같습니다 .

처리 방법을 찾기 위해 하루 중 더 좋은 시간을 보냈을 때 이것을 공유하고 싶었습니다.

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
        </customHeaders>
    </httpProtocol>
</system.webServer>


답변

405 응답은 “허용되지 않는 방법”응답입니다. 서버가 CORS 프리 플라이트 요청을 처리하도록 올바르게 구성되지 않은 것 같습니다. 다음 두 가지를 수행해야합니다.

1) IIS7이 HTTP OPTIONS 요청에 응답하도록합니다. IIS7이 OPTIONS 요청을 거부하기 때문에 405가 표시됩니다. IIS7에 익숙하지 않기 때문에이 작업을 수행하는 방법을 모르겠지만 스택 오버플로에 다른 사람이있을 것입니다.

2) CORS 프리 플라이트 요청에 응답하도록 애플리케이션을 구성합니다. 섹션 의 Access-Control-Allow-Origin줄 아래에 다음 두 줄을 추가하면됩니다 <customHeaders>.

<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />

Access-Control-Allow-Headers요청이 요청하는 헤더에 따라 섹션 에 다른 값을 추가해야 할 수도 있습니다 . 요청을위한 샘플 코드가 있습니까?

CORS 및 CORS 프리 플라이트에 대한 자세한 내용은 http://www.html5rocks.com/en/tutorials/cors/에서 확인할 수 있습니다.


답변

기본 솔루션에 필요한 것에 실제로 가까운 DavidG 답변 에서 자세히 설명 합니다.

  • 먼저 .Net 핸들러보다 먼저 실행되도록 OPTIONSVerbHandler를 구성하십시오.

    1. IIS 콘솔에서 “처리기 매핑”(서버 수준 또는 사이트 수준에서 선택합니다. 사이트 수준에서는 사이트에 대한 모든 처리기를 재정의하고 그 이후 서버 수준에서 수행 된 변경 사항을 무시합니다. 물론 서버 수준에서)를 선택합니다. 옵션 동사를 자체적으로 처리해야하는 경우 다른 사이트가 손상 될 수 있습니다.
    2. 작업 창에서 “순서있는 목록보기 …”를 선택하고 OPTIONSVerbHandler를 찾아 위로 이동합니다 (많은 클릭 …).

    web.config에서 모든 처리기를 재정 의하여이 작업을 수행 할 수도 있습니다 <system.webServer><handlers>( <clear>그런 다음 다시 정의 <add ...>하면 IIS 콘솔이 수행됩니다). 그런데이 처리기에 대해 “읽기”권한을 요청할 필요가 없습니다.

  • 둘째, 다음과 같이 cors 요구 사항에 맞게 사용자 지정 http 헤더를 구성합니다.

    <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="POST,GET,OPTIONS"/>
        </customHeaders>
      </httpProtocol>
    </system.webServer>
    

    IIS 콘솔에서도이 작업을 수행 할 수 있습니다.

필요하지 않은 요청시에도 cors 헤더를 전송하므로 기본 솔루션입니다. 그러나 WCF를 사용하면 가장 단순한 것처럼 보입니다.

MVC 또는 webapi를 사용하면 대신 OPTIONS 동사 및 cors 헤더를 코드별로 처리 할 수 ​​있습니다 ( “수동”또는 최신 버전의 webapi에서 사용 가능한 기본 제공 지원 포함).


답변

ASP.net Web API 2를 사용하면 nuget을 통해 Microsoft ASP.NET Cross Origin 지원을 설치합니다.

http://enable-cors.org/server_aspnet.html

public static void Register(HttpConfiguration config)
{
 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
}


답변

나를위한 해결책은 다음을 추가하는 것이 었습니다.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule"/>
    </modules>
</system.webServer>

내 web.config로