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服务以及跨域的问题解决的更多相关文章

  1. Ajax请求利用jsonp实现跨域

    跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资 ...

  2. AJAX(XMLHttpRequest)进行跨域请求方法详解

    AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...

  3. ajax工作原理及jsonp跨域详解

    一.Ajax简介 ajax = 异步 JavaScript 和 XML. ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.我们知道,传统的网页(不使用ajax)如果需要更新内容, ...

  4. JSON和JSONP,原来ajax引用这个来实现跨域访问的

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  5. javascript 跨域请求详细分析(终极跨域解决办法)

    自从我接触前端以来,接手的项目里面很大部分都是前后端分离的,后端只提供接口,前端根据后端接口渲染出实际页面.个人觉得这是一个挺好的模式,前后端各自负责各自的模块,分工明确,而且也给前端更大的发挥空间. ...

  6. Nginx作为静态资源web服务之跨域访问

    Nginx作为静态资源web服务之跨域访问 首先了解一下什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相 ...

  7. jQuery 跨域访问问题解决方法(转)

    转自:http://www.jb51.net/article/21213.htm 浏览器端跨域访问一直是个问题, 多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记 ...

  8. zuul+security跨域Cors问题解决

    zuul+security跨域Cors问题解决 简介 场景 在服务后台都会出现跨域cors问题,不过一般spring解决起来比较方便,在框架+框架的基础上,问题就显得特别明显了,各种冲突,不了解源码的 ...

  9. 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

    关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...

随机推荐

  1. lua劈分字符串方法及实例

    由于工作项目需要,最近需要用lua来写一些脚本.然而lua并不想java那样有很多的好用的api,很多方法得我们自己来编写和封装,就比如今天碰到的劈分字符串,查找资料后只能自己写了一个. 代码如下 - ...

  2. Java Spring-JdbcTemplate

    2017-11-10 22:55:45 Spring 对持久层技术支持 : JDBC : org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 ...

  3. UVA-10305 Ordering Tasks (拓扑排序)

    题目大意:给出n个点,m条关系,按关系的从小到大排序. 题目分析:拓扑排序的模板题,套模板. kahn算法: 伪代码: Kahn算法: 摘一段维基百科上关于Kahn算法的伪码描述: L← Empty ...

  4. Linux vi编辑器的使用

    vi是Visual Interface的简称,它是Linux/Unix下的文本编辑器,例如你想编辑文件english.txt,则你可以在终端下输入 vi english.txt命令,然后就进入了编辑界 ...

  5. 【MVC】ASP.NET MVC 4项目模板的结构简介

    引言     在VS2012新建一个窗体验证的MVC 4项目后,可以看到微软已经帮我们做了很多了,项目里面该有的都有了,完全可以看成一个简单网站.作为开发,能理解里面文件结构和作用,也算是半只脚踏进M ...

  6. Java例子

    1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一个重要的命令javac ...

  7. Jmeter-Critical Section Controller(临界区控制器)

    The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will ...

  8. PowerDesigner15.1使用技巧总结

    1.  生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路径,并根据需要修改文件名,单击确定后便会生成sql脚本.   在Options选项卡里, ...

  9. Python 字典(Dictionary) update()方法

    refer to: http://www.runoob.com/python/att-dictionary-update.html

  10. TCP和UDP Client 代码

    最近学习要求做网络编程,使用从网上找了一些资料,主要是网络协议的分层等通讯,你可以查看英文版的资料:CScharp网络编程英文版 下面直接给出代码吧,我想一看应该就懂. TCP Client 代码: ...