最近在项目中用到了 WCF4.0 REST。在跨域调用时走了不少弯路,查了不少技术强人的文章,其实它真的就这么容易。好了不废话了直接贴代码。
调用的服务类:
1 [ServiceContract]
2 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
4 [JavascriptCallbackBehavior(UrlParameterName="callback")]
5 public class Writing
6 {
7
8 [WebGet(UriTemplate="", ResponseFormat=WebMessageFormat.Json)]
9 public List<Top> GetCollection()
10 {
11 WritingContext _context = new WritingContext();
12
13 return _context.Database
14 .SqlQuery<Top>("SELECT TOP 15 WRITINGID Id, WRITING Title FROM YC_WRITING ORDER BY WRITINGID DESC")
15 .ToList();
16 }
17 }
2 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
4 [JavascriptCallbackBehavior(UrlParameterName="callback")]
5 public class Writing
6 {
7
8 [WebGet(UriTemplate="", ResponseFormat=WebMessageFormat.Json)]
9 public List<Top> GetCollection()
10 {
11 WritingContext _context = new WritingContext();
12
13 return _context.Database
14 .SqlQuery<Top>("SELECT TOP 15 WRITINGID Id, WRITING Title FROM YC_WRITING ORDER BY WRITINGID DESC")
15 .ToList();
16 }
17 }
配置文件:
1 <system.serviceModel>
2 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
3 <standardEndpoints>
4 <webHttpEndpoint>
5 <!--
6 Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
7 via the attributes on the <standardEndpoint> element below
8 -->
9 <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false"
10 crossDomainScriptAccessEnabled="true"/>
11 </webHttpEndpoint>
12 </standardEndpoints>
13 </system.serviceModel>
2 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
3 <standardEndpoints>
4 <webHttpEndpoint>
5 <!--
6 Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
7 via the attributes on the <standardEndpoint> element below
8 -->
9 <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false"
10 crossDomainScriptAccessEnabled="true"/>
11 </webHttpEndpoint>
12 </standardEndpoints>
13 </system.serviceModel>
真正实现夸域调用只需要两步:
- 类文件中添加[JavascriptCallbackBehavior(UrlParameterName="callback")]
- 配置文件的 standardEndpoint 添加 crossDomainScriptAccessEnabled="true"
最后需要注意的是WCF REST service 模板生成的配置文件automaticFormatSelectionEnabled属性默认是true,需要将其设置为false否则firefox里返回的将是xml格式。