Ajax请求WCF服务以及跨域的问题解决
Ajax请求WCF服务以及跨域的问题解决
这两天准备重构一下项目,准备用纯html+js做前台,然后通过ajax+WCF的方式来传递数据,所以就先研究了一下ajax访问的wcf的问题,还想到还折腾了一天才明白
首先由个问题要先知道一下,ajax访问url或者服务的时候,会碰见跨域的问题,这个跨域不是主域名不一样 才是跨域,而是二级域名或者同域名的不同端口,都算跨域访问
比如a.xx.com,b.xx.com这都算跨域。或者xx.com:80,xx.com:90
ajax支持跨域的解决方案目前就是Jsonp,jquery是支持这个方案的
关于ajax跨域,jsonp的原理请参考这个文章http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html
我半天的折腾就是没明白这个,以为跨域的逻辑和cookie一样,主域名相同就行,其实不是!!!
1.建立可以Http,Url访问的WCF访问
一般WCF只是公开地址和服务,然后通过的VS的添加服务功能才能访问,如果要想让ajax访问wcf,那么wcf必须做些改变,支持ajax直接访问,ajax只能访问普通形式的url地址。
在vs中建立wcf项目模板,然后添加一个启用ajax的WCF服务
添加成功以后,web.config会发生些变化,这些变化才能支持ajax访问。无需其他设置config就可以访问了
其中有几个重点:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="WcfService1.Service2">
<endpoint address="" behaviorConfiguration="WcfService1.Service2AspNetAjaxBehavior"
binding="webHttpBinding" contract="WcfService1.Service2" bindingConfiguration="Bind1" />
</service>
建立的svc代码如下,一定要注意以下的属性签名
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service2 : IService2
{
// 要使用 HTTP GET,请添加 [WebGet] 特性。(默认 ResponseFormat 为 WebMessageFormat.Json)
// 要创建返回 XML 的操作,
// 请添加 [WebGet(ResponseFormat=WebMessageFormat.Xml)],
// 并在操作正文中包括以下行:
// WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public Person DoWork()
{
return new Person() { ID=1, Name="Hello World"};
}
// 在此处添加更多操作并使用 [OperationContract] 标记它们
}
然后再IIS中发布,配置host,设置一个域名,就可以直接访问到这个服务的具体方法DoWork的页面,效果如下:
2.建立Web项目,在Html中使用ajax访问wcf服务
在IIS中建设Web网站,配置测试域名,要和wcf的域名不一样。
然后主要就是JS的ajax访问,这里使用的Jquery
(function($, window, undefined) {
$(function () {
var RootDom = $("body");
RootDom.delegate("#test", "click", function () {
$.ajax({
url: 'http://wcftest.xxx.com/Service2.svc/DoWork?callback=?',
cache: false,
dataType: "jsonp",
jsonpCallback:"person22",
success: function (data) {
alert(data.ID);
alert(data);
},
fail: function (data) {
alert(data);
}
});
//这个方法更简单。
$.getJSON("http://wcftest.xxx.com/Service2.svc/DoWork?callback=?", function (data) {
alert(data.Name);
})
});
})
})(jQuery, window)
//其中需要的注意的是callback=?,使用这个代码,表示通知wcf服务,我是在请求jsonp数据,而且支持跨域。
Ajax请求WCF服务以及跨域的问题解决的更多相关文章
- Ajax请求利用jsonp实现跨域
跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资 ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解
AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...
- ajax工作原理及jsonp跨域详解
一.Ajax简介 ajax = 异步 JavaScript 和 XML. ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.我们知道,传统的网页(不使用ajax)如果需要更新内容, ...
- JSON和JSONP,原来ajax引用这个来实现跨域访问的
由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...
- javascript 跨域请求详细分析(终极跨域解决办法)
自从我接触前端以来,接手的项目里面很大部分都是前后端分离的,后端只提供接口,前端根据后端接口渲染出实际页面.个人觉得这是一个挺好的模式,前后端各自负责各自的模块,分工明确,而且也给前端更大的发挥空间. ...
- Nginx作为静态资源web服务之跨域访问
Nginx作为静态资源web服务之跨域访问 首先了解一下什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相 ...
- jQuery 跨域访问问题解决方法(转)
转自:http://www.jb51.net/article/21213.htm 浏览器端跨域访问一直是个问题, 多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记 ...
- zuul+security跨域Cors问题解决
zuul+security跨域Cors问题解决 简介 场景 在服务后台都会出现跨域cors问题,不过一般spring解决起来比较方便,在框架+框架的基础上,问题就显得特别明显了,各种冲突,不了解源码的 ...
- 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法
关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...
随机推荐
- BZOJ 4013 【HNOI2015】 实验比较
题目链接:实验比较 如果我们把相等关系全部缩起来的话,这道题给出的小于关系如果有环,那么就是不合法的,否则就构成了一片森林. 定义等于号连起来的所有变量看做一个块. 然后我们就可以令\(f_{i,j} ...
- iOS开发网络篇—Socket编程
一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程 ...
- 【Python】单元测试框架unitest及其高级应用
Unittest Unittest是python的一个单元测试框架,但是它不仅适用于单元测试,还适用自动化测试用例的开发与执行.我们可以很方便的使用它组织执行测试用例,使用它提供的丰富的断言方法进行测 ...
- 使用Bootstrap插件datapicker获取时间
引入css和js <link rel="stylesheet" href="/${appName}/commons/css/datapicker/datepicke ...
- charles工具过滤腾讯视频播放器广告
Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当程序连接Charles的代理访问互联网时,Charles可以监控这个程序发送和接收的所有数据.它允许一个开发者查看所有连接互联 ...
- Vue.js组件设计原则
页面上把每个独立可以交互的区域视为一个组件 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面
- 安装Ubuntu之后的配置
经常装系统或者给人装系统,这些配置还是记一下,方便恢复到以前的环境 删除libreoffice sudo apt-get remove libreoffice-common 删除Amazon的链接 s ...
- Sublime 中文标题乱码
---title:Sublime 中文标题乱码--- #markdown语法(非Github Flavored) #解决办法: 在用户设置里添加一项,强制不根据 dpi 缩放dpi_scale: 1. ...
- iOS导航栏的正确隐藏方式
在项目中经常碰到首页顶部是无限轮播,需要靠最上面显示.有的设置导航栏为透明等一系列的方法,这个可以借助第三方.或者干脆简单粗暴的直接隐藏掉导航栏.可是push到下一个页面的时候是需要导航栏的,如何做了 ...
- JQuery和Zepto的差异(部分)
1.width()/height() Zepto.js: 由盒模型(box-sizing)决定 jQuery: 忽略盒模型,始终返回内容区域的宽/高(不包含 padding.border) jQuer ...