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序列化資料並返回,以後再細說吧。