JSONP

JSONP örneği, WCF REST hizmetlerinde Doldurma (JSONP) ile JSON desteğinin nasıl yapılacağını gösterir. JSONP, geçerli belgede betik etiketleri oluşturarak etki alanları arası betikleri çağırmak için kullanılan bir kuraldır. Sonuç, belirtilen geri çağırma işlevinde döndürülür. JSONP, gibi <script src="http://..." > etiketlerin herhangi bir etki alanından betikleri değerlendirebileceği fikrine dayanır ve bu etiketler tarafından alınan betik, diğer işlevlerin zaten tanımlandığı bir kapsam içinde değerlendirilir.

Gösteriler

JSONP ile etki alanları arası betik oluşturma.

Tartışma

Örnek, sayfa tarayıcıda işlendikten sonra dinamik olarak bir betik bloğu ekleyen bir Web sayfası içerir. Bu betik bloğu, GetCustomertek bir işlemi olan bir WCF REST hizmetini çağırır. WCF REST hizmeti, bir müşterinin adını ve geri çağırma işlevi adına sarmalanmış adresini döndürür. WCF REST hizmeti yanıt verdiği zaman, Web sayfasındaki geri çağırma işlevi müşteri verileriyle çağrılır ve geri çağırma işlevi verileri Web sayfasında görüntüler. Betik etiketinin eklenmesi ve geri çağırma işlevinin yürütülmesi, ASP.NET AJAX ScriptManager denetimi tarafından otomatik olarak işlenir. Kullanım düzeni, tüm ASP.NET AJAX proxy'leriyle aynıdır ve aşağıdaki kodda gösterildiği gibi JSONP'yi etkinleştirmek için bir satır eklenir:

var proxy = new JsonpAjaxService.CustomerService();
proxy.set_enableJsonp(true);
proxy.GetCustomer(onSuccess, onFail, null);

Hizmet ile crossDomainScriptAccessEnabled olarak ayarlandığından trueWeb sayfası WCF REST hizmetini WebScriptEndpoint çağırabilir. Bu yapılandırmaların her ikisi de system.serviceModel> öğesinin <altındaki Web.config dosyasında yapılır.

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>

ScriptManager, hizmetle etkileşimi yönetir ve JSONP erişimini el ile uygulamanın karmaşıklığını gizler. crossDomainScriptAccessEnabled olarak ayarlandığında true ve bir işlemin yanıt biçimi JSON olduğunda, WCF altyapısı geri çağırma sorgu dizesi parametresi isteğinin URI'sini inceler ve JSON yanıtını geri çağırma sorgu dizesi parametresinin değeriyle sarmalar. Örnekte, Web sayfası aşağıdaki URI ile WCF REST hizmetini çağırır.

http://localhost:33695/CustomerService/GetCustomer?callback=Sys._json0

Geri çağırma sorgu dizesi parametresi değeri JsonPCallbackolduğundan, WCF hizmeti aşağıdaki örnekte gösterilen bir JSONP yanıtı döndürür.

Sys._json0({"__type":"Customer:#Microsoft.Samples.Jsonp","Address":"1 Example Way","Name":"Bob"});

Bu JSONP yanıtı, Web sayfasının istediği geri çağırma işlevi adıyla sarmalanmış JSON olarak biçimlendirilmiş müşteri verilerini içerir. ScriptManager, etki alanları arası isteği gerçekleştirmek için bir betik etiketi kullanarak bu geri çağırmayı yürütür ve ardından sonucu ASP.NET AJAX proxy'sinin GetCustomer işlemine geçirilen onSuccess işleyicisine geçirir.

Örnek iki ASP.NET web uygulamasından oluşur: biri yalnızca bir WCF hizmeti, diğeri de hizmeti çağıran .aspx web sayfasını içerir. Çözümü çalıştırırken, Visual Studio iki web sitesini farklı bağlantı noktalarında barındırarak hizmetin ve istemcinin farklı etki alanlarında yaşadığı bir ortam oluşturur.

Örnek çalıştırmak için

  1. JSONP Örneği için çözümü açın.

  2. tarayıcıda başlatmak http://localhost:26648/JSONPClientPage.aspx için F5 tuşuna basın.

  3. Sayfa yüklendikten sonra "Ad" ve "Adres" için metin girişlerinin değerlerle doldurulduğunu unutmayın. Bu değerler, tarayıcı sayfayı işlemeyi tamamladıktan sonra WCF hizmetine yapılan bir çağrıdan sağlanmıştır.