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。
附上测试项目文件:
PS:
以前的版本需要自己用JavaScriptSerializer序列化数据并返回,以后再细说吧。