การเปิดใช้งานการแบ่งปันทรัพยากรข้ามแหล่งที่มาบน IIS7


89

ฉันเพิ่งพบกับการโพสต์คำขอ 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>

ป้อนคำอธิบายภาพที่นี่

ทุกอย่างทำงานได้ดีในขณะนี้อย่างไรก็ตามยังคงส่งคืนการตอบกลับ 405 ก่อนที่จะส่งการตอบกลับที่ใช้งานได้ 200 ครั้ง

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

ปรับปรุง: 3/02/2557

มีบทความที่อัปเดตล่าสุดในนิตยสาร MSDN รายละเอียดการรองรับ CORS ใน ASP.NET Web API 2

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


มันแก้ไขปัญหาของฉันในการรับไอคอนการจัดเรียงที่ผิดพลาดของปลั๊กอิน jQuery bootgrid ต้องการโหลด glyphicons-halflings-regular.woff จากโฟลเดอร์แบบอักษร Bootstrap
Iman

คำตอบ:


77

เป็นไปได้ว่า IIS 7 'จัดการ' การตอบสนองของ HTTP OPTIONS แทนที่จะเป็นแอปพลิเคชันของคุณที่ระบุ เพื่อตรวจสอบสิ่งนี้ใน IIS7

  1. ไปที่การแมปเครื่องจัดการไซต์ของคุณ

  2. เลื่อนลงไปที่ 'OPTIONSVerbHandler'

  3. เปลี่ยน 'ProtocolSupportModule' เป็น 'IsapiHandler'

  4. ตั้งค่าไฟล์ปฏิบัติการ:% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll

ตอนนี้รายการกำหนดค่าของคุณด้านบนควรเริ่มต้นเมื่อมีการส่งคำกริยา HTTP OPTIONS

หรือคุณสามารถตอบสนองต่อคำกริยา HTTP OPTIONS ในเมธอด BeginRequest ของคุณ

    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();
        }

    }

4
ฉันลองทั้งสองวิธีแล้ว แต่มีเพียงวิธี BeginREquest เท่านั้นที่ใช้ได้กับฉัน ขอบคุณ @Shah
Basant B. Pandey

สำหรับฉันการเพิ่มลงใน web.config ด้วยวิธีเดียวกับ OP เป็นวิธีเดียว Global.asax / BeginRequest ไม่ทำงาน
twDuke

5
หลังจาก 2 วันของการวิจัยการใช้โซลูชันทางเลือกตามพื้นฐานApplication_BeginRequestเป็นวิธีเดียวที่ฉันจะแก้ไขปัญหาได้ ฉันลองใช้วิธีอื่นโดยใช้customHeaders( stackoverflow.com/a/19091291/827168 ) การถอดOPTIONSVerbHandlerตัวจัดการการถอดWebDAVโมดูลและตัวจัดการ ( stackoverflow.com/a/20705500/827168 ) แต่ไม่มีผลกับฉัน หวังว่านี่จะช่วยคนอื่น ๆ และขอบคุณ @Mendhak สำหรับคำตอบของคุณ!
pomeh

21
ASP.NET และ IIS เหตุใดการกำหนดค่าแนวคิดง่ายๆเช่น CORS จึงเป็นเรื่องยาก มันง่ายอย่างแท้จริง เพียงแค่อ่านข้อกำหนดของ W3C คุณสามารถเรียนรู้ได้ใน 10 นาทีจากนั้นคุณต้องใช้เวลา 10 วันในการค้นหาวิธีกำหนดค่าใน ASP.NET และ IIS
Saeed Neamati

3
@Mendhak คุณช่วยชีวิตฉันฮ่า ๆ สิ่งเดียวที่ฉันเพิ่มคือHttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");คุกกี้การตรวจสอบสิทธิ์ที่ใช้ร่วมกัน
Nexxas

26

ฉันไม่สามารถโพสต์ความคิดเห็นได้ดังนั้นฉันจึงต้องใส่คำตอบแยกต่างหาก แต่มันเกี่ยวข้องกับคำตอบที่ชาห์ยอมรับ

ตอนแรกฉันทำตามคำตอบของ Shahs (ขอบคุณ!) โดยกำหนดค่า OPTIONSVerbHandler ใน IIS อีกครั้ง แต่การตั้งค่าของฉันได้รับการกู้คืนเมื่อฉันปรับใช้แอปพลิเคชันของฉันใหม่

ฉันลงเอยด้วยการลบ OPTIONSVerbHandler ใน Web.config ของฉันแทน

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

16
สำหรับใครที่ไม่ได้ใช้ web.config ทุกวันให้เข้าไปข้างใน "<system.webServer>"
SemanticZen

20

ฉันพบข้อมูลที่http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.htmlเพื่อเป็นประโยชน์อย่างมากในการตั้งค่า HTTP OPTIONS สำหรับบริการ WCF ใน IIS 7

ฉันเพิ่มสิ่งต่อไปนี้ใน web.config ของฉันแล้วย้าย OPTIONSVerbHandler ในรายการ 'hander mappings' ของ IIS 7 ไปที่ด้านบนสุดของรายการ ฉันยังให้สิทธิ์ในการอ่าน OPTIONSVerbHander โดยดับเบิลคลิกที่แฮนเดอร์ในส่วนการแมปตัวจัดการจากนั้นคลิกที่ 'ข้อ จำกัด การร้องขอ' จากนั้นคลิกที่แท็บการเข้าถึง

น่าเสียดายที่ฉันพบอย่างรวดเร็วว่า IE ไม่รองรับการเพิ่มส่วนหัวให้กับวัตถุXDomainRequest (ตั้งค่า Content-Type เป็น text / xml และเพิ่ม SOAPAction header)

แค่อยากจะแบ่งปันสิ่งนี้ในขณะที่ฉันใช้เวลาส่วนที่ดีกว่าของวันเพื่อค้นหาวิธีจัดการกับมัน

<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>

การกำหนดค่า IIS isapiHandler ของ Shah ไม่ทำงานฉันไม่ได้ลองวิธีการเขียนโปรแกรม อย่างไรก็ตามฉันยังพบการกำหนดค่า WCF ด้านบนใน web.config ทำเคล็ดลับ Chrome ยังคงส่ง OPTIONS และได้รับ 405 ในครั้งแรก แต่โพสต์คำขออื่นซึ่งถูกต้องแล้ว
จอมพล

ดูเหมือนว่า Chrome เวอร์ชันปัจจุบันจะไม่คำนึงถึงส่วนหัวของคอร์ที่ได้รับจากการตอบกลับที่มีสถานะ http ข้อผิดพลาดอีกต่อไป ดังนั้นในกรณีนี้จะไม่เกิดขึ้นอีกต่อไปและดำเนินการขอข้ามโดเมน นี่คือพฤติกรรมที่ดีกว่า imho
Frédéric

1
ขอบคุณสำหรับการตอบกลับนี้ หากคุณอ่านคำตอบด้านบนนี้อย่าลืมให้ OPTIONSVerbHander เข้าอ่านตามที่อธิบายไว้ข้างต้น
John Meyer

การระบุแหล่งที่มาจะปลอดภัยกว่า ดู: <add name="Access-Control-Allow-Origin" value="http://my.origin.host" />
Gabriel Simas

9

การตอบกลับ 405 เป็นการตอบสนอง "วิธีที่ไม่อนุญาต" ดูเหมือนว่าเซิร์ฟเวอร์ของคุณไม่ได้รับการกำหนดค่าอย่างเหมาะสมเพื่อจัดการคำขอของ CORS preflight คุณต้องทำสองสิ่ง:

1) เปิดใช้งาน IIS7 เพื่อตอบสนองคำขอ HTTP OPTIONS คุณได้รับ 405 เนื่องจาก IIS7 ปฏิเสธคำขอ OPTIONS ฉันไม่รู้ว่าจะทำอย่างไรเพราะฉันไม่คุ้นเคยกับ IIS7 แต่อาจมีคนอื่น ๆ ใน Stack Overflow ที่ทำ

2) กำหนดค่าแอปพลิเคชันของคุณเพื่อตอบสนองต่อคำขอของ CORS preflight คุณสามารถทำได้โดยการเพิ่มสองบรรทัดต่อไปนี้ใต้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 preflight ได้ที่นี่: http://www.html5rocks.com/en/tutorials/cors/


9

อธิบายโดยละเอียดจากคำตอบของ DavidGซึ่งใกล้เคียงกับสิ่งที่จำเป็นสำหรับการแก้ปัญหาพื้นฐาน:

  • ขั้นแรกกำหนดค่า OPTIONSVerbHandler ให้ดำเนินการก่อนตัวจัดการ. Net

    1. ในคอนโซล IIS ให้เลือก "Handler Mappings" (ไม่ว่าจะในระดับเซิร์ฟเวอร์หรือระดับไซต์โปรดระวังว่าในระดับไซต์จะกำหนดตัวจัดการทั้งหมดสำหรับไซต์ของคุณใหม่และจะเพิกเฉยต่อการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นในระดับเซิร์ฟเวอร์หลังจากนั้นและแน่นอนในระดับเซิร์ฟเวอร์ สิ่งนี้สามารถทำลายไซต์อื่น ๆ ได้หากพวกเขาต้องการการจัดการคำกริยาตัวเลือกของตนเอง)
    2. ในบานหน้าต่างการดำเนินการเลือก "ดูรายการที่เรียงลำดับ ... " ค้นหา OPTIONSVerbHandler และเลื่อนขึ้น (คลิกจำนวนมาก ... )

    คุณสามารถทำได้ใน web.config โดยการกำหนดตัวจัดการทั้งหมดใหม่ภายใต้<system.webServer><handlers>( <clear>จากนั้น<add ...>กลับมาใหม่นี่คือสิ่งที่คอนโซล IIS ให้คุณ) (อย่างไรก็ตามไม่จำเป็นต้องขอสิทธิ์ "อ่าน" ในตัวจัดการนี้)

  • ประการที่สองกำหนดค่าส่วนหัว 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 เราสามารถจัดการส่วนหัวกริยาและ cors ของ OPTIONS แทนด้วยรหัสได้ (ไม่ว่าจะเป็น "ด้วยตนเอง" หรือด้วยการสนับสนุนในตัวที่มีอยู่ใน webapi เวอร์ชันล่าสุด)


สิ่งนี้ได้ผลสำหรับฉัน ฉันไม่ชอบที่ตัวจัดการทุกคนลงเอยด้วยการกำหนดนิยามใหม่ใน Web.config แต่ดูเหมือนว่าจะเป็นสิ่งที่ฉันต้องทำเพื่อให้บริการ WCF ของเราเปิดใช้งาน CORS +1
Manny

3

ด้วย ASP.net Web API 2 ให้ติดตั้งการสนับสนุน Microsoft ASP.NET Cross Origin ผ่าน nuget

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);
}

คุณทราบหรือไม่ว่ามีการprogrammaticallyตั้งค่าพารามิเตอร์ "ORIGIN" แรกของEnableCorsAttributeหรือไม่ สมมติว่าไม่ได้อยู่ที่นี่ใน Register แต่เป็นคำขอ HTTP แต่ละรายการที่เข้ามาตรวจหาต้นตอว่ามาจากไหนตรวจสอบให้แน่ใจว่าใช้ได้ (ตรวจสอบกับรายการที่ได้รับอนุมัติบางส่วน) จากนั้นตอบกลับด้วยAccess-Allow-Control-Origin="thatdomain.com"? @Andrew
Mark Pieszak - Trilon.io

3

ทางออกสำหรับฉันคือเพิ่ม:

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

ไปที่ web.config ของฉัน


2

Alsalaam Aleykum.

วิธีแรกคือทำตามคำแนะนำในลิงค์นี้:

http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html

ซึ่งสอดคล้องกับการกำหนดค่าเหล่านี้:

<handlers>
  <clear />
  <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" type="" modules="ProtocolSupportModule" scriptProcessor="" resourceType="Unspecified" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
  <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="4194304" />
  <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="4194304" />
  <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" scriptProcessor=""
  resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64"
  responseBufferLimit="4194304" />
  <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32"
  responseBufferLimit="4194304" />
  <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler"
  scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64"
  responseBufferLimit="4194304" />
  <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32"
  responseBufferLimit="4194304" />
  <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler"
  scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64"
  responseBufferLimit="4194304" />
  <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32"
  responseBufferLimit="4194304" />
  <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" scriptProcessor=""
  resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="ISAPI-dll" path="*.dll" verb="*" type="" modules="IsapiModule" scriptProcessor="" resourceType="File" requireAccess="Execute" allowPathInfo="true" preCondition="" responseBufferLimit="4194304" />
  <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness64"
  responseBufferLimit="0" />
  <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler"
  scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0"
  responseBufferLimit="4194304" />
  <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" modules="ManagedPipelineHandler"
  scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" modules="ManagedPipelineHandler"
  scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="4194304" />
  <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"
  allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="classicMode,runtimeVersionv4.0,bitness32"
  responseBufferLimit="0" />
  <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="TRACEVerbHandler" path="*" verb="TRACE" type="" modules="ProtocolSupportModule" scriptProcessor="" resourceType="Unspecified" requireAccess="None" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" type="" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false"
  preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
  <add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304"
  />
</handlers>

วิธีที่สองคือการตอบสนองต่อคำกริยา HTTP OPTIONS ในเมธอด BeginRequest ของคุณ

  protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Request-Method", "GET ,POST, PUT, DELETE");

        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin,Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "86400"); // 24 hours
        HttpContext.Current.Response.End();
    }
}

2

Microsoft ใช้เวลาหลายปีในการระบุช่องว่างและจัดส่งโมดูล CORS นอกแบนด์เพื่อแก้ปัญหานี้

  1. ติดตั้งโมดูลจากMicrosoft
  2. กำหนดค่าด้วยตัวอย่างข้อมูล

ดังต่อไปนี้

<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">            
            <add origin="http://*" allowed="true" />
        </cors>
    </system.webServer>
</configuration>

โดยทั่วไปแล้วจะง่ายกว่าส่วนหัวที่กำหนดเองของคุณมากและยังให้การจัดการคำขอ preflight ที่ดีกว่าอีกด้วย

ในกรณีที่คุณจำเป็นต้องเหมือนกันสำหรับ IIS เอ็กซ์เพรส, ใช้บางสคริปต์ PowerShell ที่ผมเขียน


0

สิ่งหนึ่งที่ไม่ได้กล่าวถึงในคำตอบเหล่านี้คือหากคุณใช้ IIS และมีแอปพลิเคชันย่อยที่มี web.config แยกต่างหากคุณอาจต้องมี 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="POST,GET,OPTIONS"/>
  </customHeaders>
</httpProtocol>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.