2015-05-07 25 views
9

Heyya,Ajax Web Servis Çağrı - No 'Erişim-Control-Allow-Origin' başlığı bu soru daha önce sorulmuş biliyorum ve burada ama yine de her sorunun her cevap okudum

mevcutsa Projemin düzgün bir şekilde çalışmasını sağlayamıyorum. Benim senaretimiz diğer sorulardan biraz farklı olsa da, bunun bir fark yaratıp yaratmadığından emin değiliz ama işte gidiyoruz.

Web servislerinden oluşan bir projem var. Yalnız hizmetler iyi çalışıyor, bununla ilgili bir sorun yok. Ve bir şeylerin UI parçası işleyen ve bu hizmetleri jquery ajax yoluyla çağıran başka bir proje var. İyi çalışıyor çünkü bu vakayı daha önce Google Chrome'da test etmedim. Her şey Internet Explorer'da mükemmel çalışır.

Şimdi; web servis uygulamam 40000 bağlantı noktasında (localhost: 40000) çalışır ve UI projesi başka bir rasgele bağlantı noktasında çalışır ancak yine de localhost içinde çalışır. Dediğim gibi ajax çağrılarım internet explorer'da mükemmel çalışır, ancak Google Chrome söz konusu olduğunda başarısız olur. böylece internette bazı sonrası ben localhost yerine IP adresine değiştirebilirsiniz önerdi önce konsol aşağıdaki hata gösterir:

XMLHttpRequest cannot load http://127.0.0.1:40000/abc.asmx/TheMethodName. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:17256' is therefore not allowed access. The response had HTTP status code 400. 

arada, "40000 localhost" gibiydi.

Neyse, ben de benim web hizmeti proje üzerinde benim web.config dosyasını düzenlenebilir ve eklemiş, ilk satırı kullanırsanız,

<system.serviceModel> 
    <bindings> 
    <webHttpBinding> 
     <binding name="crossDomain" crossDomainScriptAccessEnabled="true"> 
     </binding> 
    </webHttpBinding> 
    </bindings> 

    <behaviors> 

    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 

    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 


<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="http://localhost:17256" /> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
     <add name="Access-Control-Max-Age" value="1728000" /> 

    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

BTW (herhangi bir anlam ifade etmeyen) Aşağıdaki: it Tamamen başarısız olur ve yanıt üstbilgisi iletilerinin eşleşmediğini ve hizmetin başlatılmasına bile başlayamayacağımı söyler.

Şimdi
crossDomain: true, 

, burada ne eksik:

Ve evet, ben de benim ajax arama düzenledikten aşağıdaki parametreyi eklendi? Günler boyunca bu konudaydım ve aklımı kaybetmek üzereyim :) Projenin bütün yapısını değiştirmek için çok geç (hizmet - UI stili demek istiyorum) UI projeleri. Lütfen yardım edin çaresizim! :)

Alkış


Düzenleme:

Demek ki ben JSONP değil JSON kullanmaya gerek çıkıyor - bu gayet Erişim Denetimi şey ile sıkışmış almaz beri . Ajax çağrılarımı JSONP olanlara dönüştürebilirim. Ama başka bir yardıma ihtiyacım var :)

Ayrı sayfalardaki her işlemden çağrılan global bir ajax yöntemi yazdım ve çekicilik gibi çalışıyor (tabii ki Internet Explorer'da). Şimdi bu sarmalayıcı işlevini bir jsonp şeyine dönüştürmek için ne yapmalıyım? (Kafam karışık budur) geri çağırma yöntemiyle 'jsonp_callback':

function RemoteCall(WebService, RemoteMethod, RemoteParameters, callbackResult) { 

if (RemoteParameters == null || RemoteParameters == "") { 
    RemoteParameters = "{ }"; 
} 

var remoteCall = $.ajax({ 
    type: "POST", 
    url: ProvideService(WebService, RemoteMethod), 
    data: RemoteParameters, 
    contentType: ajaxContentType, 
    dataType: ajaxDataType, 
    async: true, 
    crossDomain: true, 
    success: function (msg) { 
     msg.header("Access-Control-Allow-Origin", "*"); 
     callbackResult(msg.d); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     callbackResult(xhr.status + '\r\n' + thrownError + '\r\n' + xhr.responseText); 
    } 
}); 

}

ben JSONP gibi bir özellik eklemek gereken bazı mesajları gördü. Peki buna ne dersin?

Başka bir şey; Ben

var jSONParams = '{ UserID: "1", EmailAddress: "[email protected]" }'; 

Aynı biçimi olarak bu göndermeye devam mı yoksa JSON nesnesi ya da bir şey bir tür dönüştürülmesi gerekir gibi bir değişkene bir metin olarak benim json parametreleri göndererek edilmiştir?

BTW: benim küresel ajax fonksiyonu tamamen ayrı JS dosyasına olduğunu - emin olsa Bir değişiklik olup olmadığını ...

Şerefe CORS konunun hiç hoş değil karaya

+0

ciddiye kimse? –

+0

Son nokta herhangi bir kimlik doğrulama türünü kullanıyor mu? Windows auth, vb? –

cevap

0

Yanıtlarınız için hepinize teşekkür ederiz;

Sorunun çözümünü buldum. Benim web.config dosyasına Access-Control-Allow-Origin başlığını eklenen sonra düzgün hata mesajı :)

tam dikkat edilmemiştir gibi görünüyor, ben diğer bazı başlarken çıkıyor içerik türü özel üstbilgisi olan bir hata eksikti ve yine de CORS hatasını aldığımı düşündüm.

Yani, benim web.config içine <add name="Access-Control-Allow-Origin" value="*" /> tanımını eklemek, aslında ilk etapta benim çapraz-kaynaklı sorunumu çözdü! Ayrıca, web.config başlık girişiyle belirli alan adlarına veya bağlantı noktalarına izin vermek için test ettim ve aynı zamanda çekicilik gibi de çalıştım. Çünkü hizmetlerin herkese açık olarak yayınlanmayacağından beri kullanmak için en iyi seçenek olduğunu düşünüyorum. herkese

<add name="Access-Control-Allow-Origin" value="http://localhost:17256" /> 

Alkış, sorun çözüldü :)

+0

Web.config dosyasına hangi etiketi eklediniz? –

0

Karşılama browserland i aşağıdaki öneriler vardır:

  1. belki bir projeyi oluşturma webservice ve aynı bağlantı noktasında UI bölümü barındırmak ve webcoder ve UI alt projeleri o kolay bu kurtulabiliriz yapacak yapabilirsek.
  2. Web servis sağlayıcınız JSON içinde yanıt verirse, JSONP kullanmayı düşünün, web servisine bir JSONP desteğinin olması her zaman iyi bir fikirdir.

Ben

Saygılarımızla, Arif İmran yardımcı olur umarım

Ben sadece tüm AJAX çağrısı değiştirmek yerine CORS'yi etkinleştirmek için tercih edecektir
+0

Şimdi, orijinal sorumumda görebileceğiniz JSONP ile ilgili bir sorum var. Düzenledim. Herhangi bir yardım? :) –

+0

Oh ve PS: Bu projeleri aynı bağlantı noktasında barındıramam - hizmet projesinin başka bir UI projesine sağlayıcı proje gibi olacağından hiçbir faydası olmayacak ve tüm kullanıcı arayüzünü gerçekten çalıştırmak istemiyorum. Aynı bağlantı noktasında projeler - sanal dizinlerin her bağlantı noktası için IIS'de oluşturulduğundan ve IIS'nin buna izin verip vermeyeceğinden şüphe duymadığından emin değilim ... JSONP ile şansımı kullanacağımı düşünüyorum - eğer bunu çözebilirsem: –

+1

Bu http://json-jsonp-tutorial.craic.com/index.html adresine bir göz atın, JSONP uygulaması sizin için oldukça zor bir şey değildir. Karşılaştığınız problem hakkında daha spesifik olabilir misiniz? –

5

.

WebService için web.config dosyasını aşağıdaki satırı eklemek üzere değiştirmeyi denediniz mi?

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 

      <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
    </httpProtocol> 

Kontrol ayrıca CORS/JSONP daha iyiyse bu sorular So, JSONP or CORS?

1

çözme CORS hatalara anahtar sunucusu yanıtı (ler) deki başlıklarına dikkat edilir için. Bu başlıkları incelemek için Fiddler gibi bir http trafik monitörü indirmeniz gerekiyor. Sonra, tam olarak neyin yanlış gittiğini anlamak için tarayıcı konsolu hatalarıyla birlikte kullanabilirsiniz. İşte

tipik/başarılı 200 OK CORS yanıt (Fiddler'dan doğrudan alınan) gibi görünüyor: Eğer No 'Access-Control-Allow-Origin' header is present on the requested resource alıyoruz durumda

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Vary: Accept-Encoding 
Server: Microsoft-IIS/7.5 
Access-Control-Allow-Origin: http://localhost:1234 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Methods: GET,POST,OPTIONS 
X-AspNet-Version: 4.0.30319 
X-UA-Compatible: IE=edge 
Persistent-Auth: false 
WWW-Authenticate: Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQIC...etc. 
Date: Fri, 08 May 2015 01:14:37 GMT 
Connection: close 
Content-Length: 4711 

...response body etc. etc. 

başlık ya cevaben eksik veya Chrome'un W3C teknik özelliklerinin uygulanmasını ihlal edecek şekilde sunulması.

Web.config dosyanıza bakarak, ikincisine bahse girerim. Örneğin, bu geçerli bir Erişim Kontrolü birden çok girişi olan Origin başlığı izin ver: genellikle geçersiz web.config başlıkları bölümü birden fazla giriş teslim edecek yapılandırıldığı şekilde, oysa

Access-Control-Allow-Origin: http://domain1.com,http://domain2.com 

Access-Control-Allow-Origin: http://localhost:17256 
Access-Control-Allow-Origin: * 

...özellikle kimlik doğrulama ve Access-Control-Allow-Kimlik Bilgileri başlıklarının güvenli uç noktalara geçirildiği senaryolarda:

İlgili konular