[jQuery]在WCF 4中如何用JSONP輕鬆實現跨域Ajax請求

來源:互聯網
上載者:User

WCF 4(based on .NET Framework 4.0) 是我們能夠輕鬆地實現跨域的WCF services訪問。接下來我們就一步步講解如何?,並說明實現過程中遇到的一些問題和解決方案。

1,開啟Visual Studio 2010,添加一個Web Application或者WCF Service Application,並在項目中添加一個Ajax-enabled WCF service。

2,修改這個svc檔案,如下:

 

JSONP.svc

    [ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
//UrlParameterName is the jsonp callback name in the request url.
[JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")]
public class JSONP
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public string JsonPHelloWorld()
{
return "Hello World";
}

}

這裡有幾點需要注意的:

  • 這裡的UrlParameterName參數設定為等下jQuery跨域訪問時候設定在url中的callback名稱。
  • 給需要調用的方法加上WebGet或者WebPost Attribute。如果不加,等下調用會出錯的。

3,開啟web.config檔案,並作如下修改:

 

web.config

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Forms" />
</system.web>

<system.serviceModel>
<behaviors>

<endpointBehaviors>
<behavior name="DebugSite.JSONPAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>

<serviceBehaviors>
<behavior name="EnableMetadataBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>


<bindings>
<webHttpBinding>
<!--crossDomainScriptAccessEnabled make the WCF 4 service support the JSONP-->
<binding name="HttpJsonpBinding" crossDomainScriptAccessEnabled="true"></binding>
</webHttpBinding>
</bindings>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

<services>
<service name="DebugSite.JSONP" behaviorConfiguration="EnableMetadataBehaviors">
<endpoint address="" behaviorConfiguration="DebugSite.JSONPAspNetAjaxBehavior" binding="webHttpBinding" bindingConfiguration="HttpJsonpBinding" contract="DebugSite.JSONP" />
</service>
</services>
</system.serviceModel>
</configuration>

這裡也有幾點要注意:

  • bindings/webHttpBinding配置塊中的crossDomainScriptAccessEnabled是WCF4中對JSOP的直接支援,在這裡設定為true即可。
  • ServiceDebug配置塊中的includeExceptionDetailInFaults僅僅只是為了讓詳細錯誤資訊返回到用戶端,可加可不加。
  • 其他一些WCF配置的細節大家就看著辦吧。

4,然後,我們需要把項目部署到IIS上,部署好後,伺服器端就完成了。部署方式我在這裡就不贅述了,需要注意幾點:

  • 添加好網站後,別忘了在部署的檔案夾上賦給IIS進程帳戶YourComputerName\IIS_IUSRS(IIS7+)或者YourComputerName\IIS_WPG(IIS6)讀的許可權,如果涉及到寫操作,需要寫入權限。
  • 如果是IIS7,在驗證方式上允許匿名訪問和Forms驗證,其他都Disable。
  • 如果是部署到非80連接埠,出現遠程無法訪問的情況,請在防火牆上開啟連接埠支援。

5,接下來用戶端很簡單,下載個jQuery庫,或者直接用google的或者Microsoft Ajax CDN上的。我這裡用的是CDN上的。添加一個HTML頁面,代碼如下,很簡單。

 

JSONP_test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JSONP_test</title>
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
function GetServerHelloWorldByJsop() {
$.getJSON("http://Jerrywengpc/jsonp.svc/JsonPHelloWorld?jsoncallback=?",
function (data) {
alert(data);
});
}
</script>
</head>
<body>
<input type="button" onclick="GetServerHelloWorldByJsop()" value="GetTime" />
</body>
</html>

$.getJSON的第一個參數是請求的url,jsoncallback就是剛才我們配置在WCF service contract上的url參數,如果是post資料,可以在url後面第二個參數填post的資料,如 { name: "John", time: "2pm" }, 第三個參數就是回呼函數。這個方法類似於重寫,所以如果沒有第二個參數,不需要寫null。

 

附上測試專案檔案:

《DOWNLOAD PROJECT》

 

 

PS:

以前的版本需要自己用JavaScriptSerializer序列化資料並返回,以後再細說吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.