IIS7 üzerinde kaynaklar arası kaynak paylaşımını etkinleştirme


89

Kısa bir süre önce Javascript isteklerini başka bir alana gönderirken karşılaştım. Varsayılan olarak XHR'nin diğer alanlara gönderilmesine izin verilmez.

Http://enable-cors.org/ adresindeki talimatları uygulayarak , bunu diğer etki alanında etkinleştirdim.

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

görüntü açıklamasını buraya girin

Şimdi her şey yolunda gidiyor, ancak çalışan 200 yanıtını geri göndermeden önce yine de 405 yanıtı veriyor.

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

Güncelleme: 3/02/2014

MSDN dergisinde yeni güncellenen bir makale var. ASP.NET Web API 2'de CORS Desteğini Detaylandırma.

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


Bootstrap fonts klasöründen glyphicons-halflings-normal.woff yüklemek isteyen jQuery bootgrid eklentisinin yanlış sıralama simgesi alma sorunumu çözdü
Iman

Yanıtlar:


77

Muhtemelen uygulamanızın bunu belirtmesi yerine HTTP SEÇENEKLERİ yanıtını 'işlemesi' IIS 7'nin bir durumudur. Bunu belirlemek için IIS7'de,

  1. Sitenizin İşleyici Eşleştirmelerine gidin.

  2. Aşağı kaydırarak 'OPTIONSVerbHandler'a gidin.

  3. 'ProtocolSupportModule' öğesini 'IsapiHandler' olarak değiştirin

  4. Yürütülebilir dosyayı ayarlayın:% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll

Şimdi, yukarıdaki yapılandırma girişleriniz bir HTTP SEÇENEKLERİ fiili gönderildiğinde devreye girmelidir.

Alternatif olarak, BeginRequest yönteminizde HTTP SEÇENEKLERİ fiiline yanıt verebilirsiniz.

    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
Her iki yöntemi de denedim, ancak sadece BeginREquest yöntemi benim için çalışıyor. Teşekkürler @Shah
Basant

Benim için bunu OP ile aynı şekilde web.config'e eklemek tek yoldu. Global.asax / BeginRequest çalışmadı.
twDuke

5
2 günlük bir araştırmadan sonra Application_BeginRequest, sorunu çözmenin tek yolu , alternatif çözümü kullanmaktı . Diğer yöntemleri kullanarak customHeaders( stackoverflow.com/a/19091291/827168 ), OPTIONSVerbHandlerişleyiciyi kaldırmayı, WebDAVmodülü ve işleyiciyi ( stackoverflow.com/a/20705500/827168 ) kaldırmayı denedim ancak hiçbiri benim için işe yaramadı. Umarım bu başkalarına yardımcı olur. Ve cevabınız için @Mendhak'a teşekkürler!
pomeh

21
Lanet olsun ASP.NET ve IIS. CORS gibi basit bir konsepti yapılandırmak neden bu kadar zor olsun? Gerçekten çok basit. Sadece W3C'nin teknik özelliklerini okuyun. 10 dakikada öğrenebilir ve ardından ASP.NET ve IIS'de nasıl yapılandıracağınızı öğrenmek için 10 güne ihtiyacınız vardır.
Saeed Neamati

3
@Mendhak, hayatımı kurtardın lol. Eklediğim tek şey her zaman HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");paylaşılan kimlik doğrulama tanımlama bilgisiydi.
Nexxas

26

Yorum gönderemiyorum, bu yüzden bunu ayrı bir cevaba koymam gerekiyor, ancak bu Shah'ın kabul ettiği cevapla ilgili.

Başlangıçta IIS'de OPTIONSVerbHandler'ı yeniden yapılandırarak Shahs'ın yanıtını (teşekkür ederim!) Takip ettim, ancak uygulamamı yeniden dağıttığımda ayarlarım geri yüklendi.

Bunun yerine OPTIONSVerbHandler'ı Web.config dosyamda kaldırdım.

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

16
Her gün web.config ile hafta geçirmeyenler için bu "<system.webServer>" içine giriyor
SemanticZen

20

Http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html adresinde bulunan bilgileri buldum IIS 7'de bir WCF hizmeti için HTTP SEÇENEKLERİ ayarlamada çok yararlı olduğunu .

Aşağıdakileri web.config dosyama ekledim ve ardından IIS 7 'işleyici eşlemeleri' listesindeki OPTIONSVerbHandler'ı listenin en üstüne taşıdım. Ayrıca OPTIONSVerbHander'a, işleyici eşlemeleri bölümündeki işleyiciye çift tıklayarak, ardından 'Kısıtlamalar İste' seçeneğine ve ardından erişim sekmesine tıklayarak OPTIONSVerbHander okuma erişimi verdim.

Maalesef, IE'nin XDomainRequest nesnesine başlık eklemeyi desteklemediğini (Content- Type'ı text / xml olarak ayarlamak ve bir SOAPAction başlığı eklemek) desteklemediğini hemen anladım .

Günün daha iyi bir bölümünü bununla nasıl başa çıkacağımı aramakla geçirdiğim için bunu paylaşmak istedim.

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

Shah'ın IIS isapiHandler yapılandırması işe yaramadı, yine de programlama yolunu denemedim. Bununla birlikte, web.config'deki yukarıdaki WCF yapılandırmasının da hile yaptığını gördüm. Chrome hala SEÇENEKLERİ gönderir ve ilk seferinde 405 alır, ancak daha sonra başka bir istek YAYINLADI, bu da doğrudur.
Mareşal

Görünüşe göre şu anki Chrome sürümü, hata http durumu içeren bir yanıtta alınan cors başlıklarını hesaba katmıyor. Yani bu durumda artık devam etmeyecek ve alanlar arası talebi gerçekleştirmeyecek. Bu daha iyi bir davranış imho.
Frédéric

1
Bu yanıt için teşekkür ederim. Yukarıdaki yanıtı gözden geçirdiyseniz, OPTIONSVerbHander'a yukarıda belirtildiği gibi okuma erişimi vermeyi unutmayın.
John Meyer

Kaynak belirtmek daha güvenlidir. bakış: <add name="Access-Control-Allow-Origin" value="http://my.origin.host" />
Gabriel Simas

9

405 yanıtı bir "Yönteme izin verilmiyor" yanıtıdır. Görünüşe göre sunucunuz CORS ön kontrol isteklerini işleyecek şekilde yapılandırılmamış. İki şey yapmanız gerekiyor:

1) HTTP SEÇENEKLERİ isteklerine yanıt vermek için IIS7'yi etkinleştirin. 405'i alıyorsunuz çünkü IIS7 OPTIONS isteğini reddediyor. IIS7'ye aşina olmadığım için bunu nasıl yapacağımı bilmiyorum ama muhtemelen Stack Overflow'da başkaları da var.

2) Uygulamanızı CORS ön kontrol isteklerine yanıt verecek şekilde yapılandırın. Bunu Access-Control-Allow-Origin, <customHeaders>bölümdeki çizginin altına aşağıdaki iki satırı ekleyerek yapabilirsiniz :

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

Başka değerler eklemeniz gerekebilir. Access-Control-Allow-Headersİsteğinizin istediği başlıklara bağlı olarak bölüme . Bir talepte bulunmak için örnek kodunuz var mı?

CORS ve CORS ön kontrolü hakkında daha fazla bilgiyi buradan edinebilirsiniz: http://www.html5rocks.com/en/tutorials/cors/


9

Temel bir çözüm için gerekli olana gerçekten yakın olan DavidG cevabından yola çıkarak :

  • İlk olarak, OPTIONSVerbHandler'ı .Net işleyicilerinden önce yürütülecek şekilde yapılandırın.

    1. IIS konsolunda, "İşleyici Eşlemeleri" ni seçin (sunucu düzeyinde veya site düzeyinde; site düzeyinde siteniz için tüm işleyicileri yeniden tanımlayacağına ve bundan sonra sunucu düzeyinde yapılan değişiklikleri göz ardı edeceğine dikkat edin; ve tabii ki sunucu düzeyinde, Bu, kendi seçenekler fiili işlemlerine ihtiyaç duyarlarsa diğer siteleri bozabilir.
    2. Eylem bölmesinde, "Sıralı listeyi görüntüle ..." öğesini seçin. OPTIONSVerbHandler'ı arayın ve yukarı taşıyın (çok sayıda tıklama ...).

    Bunu, tüm işleyicileri altında yeniden tanımlayarak da web.config içinde yapabilirsiniz <system.webServer><handlers>( <clear>sonra <add ...>geri döndüler, IIS konsolunun sizin için yaptığı şey budur) (Bu arada, bu işleyicide "okuma" izni istemenize gerek yoktur.)

  • İkinci olarak, cors ihtiyaçlarınız için özel http başlıklarını yapılandırın, örneğin:

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

    Bunu IIS konsolunda da yapabilirsiniz.

Bu temel bir çözümdür çünkü istek üzerine bile gerektirmeyen cors başlıkları gönderecektir. Ancak WCF ile en basit olanı gibi görünüyor.

MVC veya webapi ile, bunun yerine OPTIONS fiil ve cors başlıklarını koda göre ("elle" veya webapi'nin en son sürümünde bulunan yerleşik destekle) işleyebilirdik.


Bu benim için çalıştı. Her işleyicinin Web.config dosyasında yeniden tanımlanmasından hoşlanmıyorum, ancak ne yazık ki WCF hizmetlerimizi CORS'yi etkinleştirmek için yapmam gereken şey bu. +1
Manny

3

ASP.net Web API 2 ile Microsoft ASP.NET Cross Origin desteğini nuget üzerinden yükleyin.

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İlk "ORIGIN" parametresini ayarlamanın bir yolu olup olmadığını biliyor musunuz EnableCorsAttribute? Diyelim ki burada Kayıtta değil, gelen her bir HTTP isteği için. Geldiği kaynağı tespit edin, sorun olmadığından emin olun (bazı onaylılar listesine bakın) ve ardından Access-Allow-Control-Origin="thatdomain.com"? @Andrew
Mark Pieszak - Trilon.io

3

Benim için çözüm şunu eklemekti:

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

Web.config'ime


2

Alsalaam Aleykum.

İlk yol, bu bağlantıdaki talimatları izlemektir:

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

Bu konfigürasyona karşılık gelen:

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

İkinci yol, BeginRequest yönteminizdeki HTTP SEÇENEKLERİ fiiline yanıt vermektir.

  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'un boşlukları tespit etmesi ve bu sorunu çözmek için bant dışı bir CORS modülü göndermesi yıllar aldı.

  1. Modülü Microsoft'tan yükleyin
  2. Parçacıklarla yapılandırın

aşağıdaki gibi

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

Genel olarak, özel başlıklarınızdan çok daha kolaydır ve ayrıca ön kontrol isteklerinin daha iyi işlenmesini sağlar.

IIS Express için de aynısına ihtiyacınız olması durumunda, yazdığım bazı PowerShell komut dosyalarını kullanın .


0

Bu yanıtlarda belirtilmeyen bir şey, IIS kullanıyorsanız ve kendi ayrı web.config'lerine sahip alt uygulamalarınız varsa, üst dizinde aşağıdaki kodu içeren bir web.config'e sahip olmanız gerekebileceğidir.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.