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. Linux 常用环境搭建

    已有环境 python 2.6.6 jdk 1.7 —tomcat— —jenkins— —jq— —Python 2.7— —pip— —PIL— —Android SDK— —yum or apt ...

  2. JSP 隐含对象

    JSP 隐含对象 JSP隐含对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明.JSP隐含对象也被称为预定义变量. JSP所支持的九大隐含对象: 对象描述 reques ...

  3. K-Means算法的收敛性和如何快速收敛超大的KMeans?

    不多说,直接上干货! 面试很容易被问的:K-Means算法的收敛性. 在网上查阅了很多资料,并没有看到很清晰的解释,所以希望可以从K-Means与EM算法的关系,以及EM算法本身的收敛性证明中找到蛛丝 ...

  4. Eclips安装SVN插件

    1.eclipse -> Help ->Install New Software->add 2.弹出窗的"Name"和"URL"中输入如下内容 ...

  5. 将C语言的CRC32 代码转成JAVA的CRC32 代码

    public class CustomerCRC32 { private static long[] crc32Table = new long[256]; static { long crcValu ...

  6. wikioi1036 商务旅行 挺水的lca

    链接:http://wikioi.com/problem/1036/ 题意不写了. 思路:很明显找到lca然后用两个点的深度相加-lca的深度就是这一步的最近步数. #include <stdi ...

  7. IOS-网络(ASI使用)

    ASI与AFN区别 区别: 1.底层实现 1>AFN的底层基于OC的NSURLConnection与NSURLSession 2>ASI的底层基于纯C语言的CFNetWork框架 3> ...

  8. 017PHP基础知识——流程控制语句(五)

    <?php /** * break;退出循环: * 语法结构:break int;可以指定跳过几级循环: * while do_while for foreach switch */ /*$i= ...

  9. ViewPager实现引导页(添加导航点,判断是否第一次进入主界面)

    1.引导页的4个界面布局,里面加载一张背景图片 插入到guide的界面布局中(这里不用fragment) guide_background_fragment1.xml <?xml version ...

  10. 利用Sonar定制自定义JS扫描规则(三)——SSLR JavaScript Toolkit 使用说明

    在上一篇blog中讲了在sonar中如何新增自定义的JS规则,这里面比较难的地方是XPath语句的编写,而要编写正确的XPath语句,首先要拿到语法的AST,下面我们就来介绍如何使用SSLR Java ...