共用方式為


JSONP

JSONP 範例示範如何在 WCF REST 服務中使用 Padding (JSONP) 支援 JSON。 JSONP 是一種慣例,用來透過在目前文件中生成腳本標籤,以呼叫跨域腳本。 結果會在指定的回呼函式中傳回。 JSONP 是基於這樣的概念,標記如 <script src="http://..." > 可以執行來自任何網域的腳本,而這些標記擷取的腳本則在已經定義其他函式的範疇內執行評估。

演示

使用 JSONP 的跨網域腳本。

討論

此範例包含一個網頁,該網頁會在瀏覽器中頁面渲染完成後,動態新增程式碼區塊。 此文稿區塊會呼叫具有單一作業的 WCF REST 服務。 GetCustomer WCF REST 服務會傳回客戶的名稱和位址,並包裝在回呼函式名稱中。 當 WCF REST 服務回應時,會使用客戶數據叫用網頁上的回呼函式,而回呼函式會在網頁上顯示數據。 腳本標記的插入和執行回呼函式會自動由AJAX ScriptManager控件 ASP.NET 處理。 使用模式與所有 ASP.NET AJAX Proxy 相同,並新增一行以啟用 JSONP,如下列程式代碼所示:

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

網頁可以呼叫 WCF REST 服務,因為該服務使用了 WebScriptEndpointcrossDomainScriptAccessEnabled 被設定為 true。 這兩個組態是在 <system.serviceModel> 元素下的 Web.config 檔案中完成。

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

ScriptManager 會管理與服務的互動,並隱藏手動實作 JSONP 存取的複雜性。 當 crossDomainScriptAccessEnabled 設定為 true ,且作業的回應格式為 JSON 時,WCF 基礎結構會檢查回呼查詢字串參數要求 URI,並將 JSON 回應包裝為回呼查詢字串參數的值。 在範例中,網頁會使用下列 URI 呼叫 WCF REST 服務。

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

由於回呼查詢字串參數具有的值 JsonPCallback,因此 WCF 服務會傳回下列範例所示的 JSONP 回應。

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

此 JSONP 回應包含格式化為 JSON 的客戶數據,並包裝了網頁所要求的回呼函式名稱。 ScriptManager 會使用腳本標記來執行此回呼,以完成跨網域要求,然後將結果傳遞至傳遞至 ASP.NET AJAX Proxy 之 GetCustomer 作業的 onSuccess 處理程式。

此範例包含兩個 ASP.NET Web 應用程式:一個只包含 WCF 服務,另一個則包含呼叫服務的 .aspx 網頁。 執行解決方案時,Visual Studio 會在不同的埠上裝載這兩個網站,以建立服務與客戶端位於不同網域的環境。

執行範例

  1. 開啟 JSONP 範例的解決方案。

  2. F5 在瀏覽器中啟動 http://localhost:26648/JSONPClientPage.aspx

  3. 請注意,頁面載入之後,「名稱」和「位址」的文字輸入會填入值。 這些值是在瀏覽器完成轉譯頁面之後,從呼叫 WCF 服務提供。