Ajax跨域访问wcf服务中所遇到的问题总结。

工具说明:vs2012,sql server 2008R2

1.首先,通过vs2012建立一个wcf服务项目,建立好之后。再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务。

问题:由于web项目和wcf服务,不在同一个端口之中,所以涉及到“跨域”的问题。跨域访问的时候,需要对服务的接口和方法做一定的限定。具体参考:http://www.cnblogs.com/yangbingqi/p/2096197.html

2.解决了跨域问题,我们需要把服务部署到IIS。vs2012的部署比较简单,不赘述。

3.把wcf服务部署到IIS之后,在web端通过Ajax访问其ip地址,实现服务方法的调用。但是一直调用失败。方法如下:

public class Service1 : IService1
    {
        public string GetData(int value)
        {
            //return string.Format("You entered: {0}", value);
            return "{\"A\":"+"\""+value.ToString()+"\"}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }

        BLL.UserClass uc = new BLL.UserClass();

        public string show_averageSalary_job(string city, string area)
        {
            //return "{\"A\":" + "\"" + city.ToString()+area.ToString() + "\"}";

            DataTable dt=new DataTable();
            try
            {
               dt = uc.show_averageSalary_job(city, area);
            }
            catch(Exception e)
            {
                return e.Message;
            }
            return DataTableConvertJson.DataTable3Json(dt);
        }
    }

S1.起初调用show_averageSalary_job这个方法,一直调用失败。我怀疑可能的问题如下:

1).wcf配置错误,wcf配置复杂,本人对此也不熟悉,不知其深浅,所以刚开始一致纠结于是否为wcf配置在IIS中有问题。

2)请求数据和返回数据的格式问题。网上看到别人说,json和jsonp格式不同,远程调用只能用jsonp。我也纠结于此。最后证明:json和jsonp在get请求下都是ok的。

3)网上求助。一位热心人说:让我看F12下,控制台的输出,通过观察我发现每次请求时,请求都不返回任何的状态码。感觉很是困惑。

4)查看IIS日志。刚开始没看出什么端倪。但是最后发现,日志记录了很多的信息,日志是可以监测IIS服务状态的非常重要的信息。

S2.经过S1步骤,我还是没有发现任何问题,很是困惑。我随手尝试了远程访问GetData()这个方法,发现竟然是成功的!

1)因为GetData()刚开始返回的数据为简单字符型(非json),而show_averageSalary_job()这个方法返回的是Json格式的,我又猜想有可能是数据格式的传输出现了问题。

2)经过把GetData()同样返回Json类型的数据,再次远程调用发现也是ok的。证明数据格式不是出现问题的地方。那么问题很明显了,问题出现在uc.show_averageSalary_job这个方法调用上。

3)我考虑到这个地方涉及到数据库访问,那么可能就是IIS必须要远程访问数据库吧,然后就把连接字符串从localhost改成了ip,配置了数据库允许远程连接。测试还是不行。

4)最后,我猜想可能是字符串 是windows身份认证导致的,修改为sql server身份认证(user+pwd)登录。成功!终于抓出了这个深深的bug,折腾了整整一天。

收获:

一。一般性收获

1.熟悉了wcf服务在配置过程中的一些细节问题。

2.熟悉了ajax跨域调用wcf的注意事项。

二。.调试方面:

1.要学会通过IIS日志,分析IIS服务器运行状况,分析程序bug;

2.要学会控制变量,逐步尝试,最终锁定出现问题关键代码。(如本例在找问题的时候,通过GetData()排除了远程调用通信错误的可能性,通过尝试把GetData()返回json,拍出了传输数据格式错误的可能性,最后锁定了出问题的核心代码。)

3.充分利用异常捕获机制,如当时在dt = uc.show_averageSalary_job(city, area);这个访问数据库的地方 一开始就添加这样的try catch语句,则可能能更快的定位到是由于数据库访问的问题而造成的。所以,异常捕获使用真的是技巧活。

最后附上实例【我要下载

时间: 2024-10-27 00:19:33

Ajax跨域访问wcf服务中所遇到的问题总结。的相关文章

JAX-RS开发(四):ajax跨域访问REST服务时的cors解决方案

上一篇博客我们通过JSONP解决AJAX跨域问题,本文将通过CORS来解决跨域问题.CORS是HTML5新推出的,需要较高版本的浏览器才能支持.我用的IE11和Chrome41,都是支持CORS规范的.cors可以参考下面几篇文章: cors规范 http://www.w3.org/TR/cors/ cors浏览器兼容性 http://caniuse.com/#search=cors tomcat7的cors解决方案 http://tomcat.apache.org/tomcat-7.0-doc

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

关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace WcfService1 { [ServiceContract] public interface IAddService { [OperationContract] [WebInvoke(Method="GET",RequestFormat=WebMessageFormat.Json, Resp

Web Api 2(Cors)Ajax跨域访问

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,

浅析JSONP-解决Ajax跨域访问问题

浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应,怎么回事?代码没怎么改动,唯一修改的地方就是jQuery的ajax方法中的url地址.难道是这里的问题,经过检查和调试,发现原来是同源策略在作怪,我们知道,JavaSc

CXF发布支持ajax跨域访问的restful webservice

用apache cxf构建了一个玩具型restful webservice,内嵌jetty,加上gradle,发布无比轻松. apply plugin: 'java' apply plugin: 'application' repositories { maven { url "http://maven.oschina.net/content/groups/public" } } [compileJava,compileTestJava,javadoc]*.options*.encod

Access-Control-Allow-Origin:ajax 跨域访问

在使用jquery的$.ajax跨域访问的时候,如客户端域名是www.test.com,而服务器端是www.test2.com,在客户端通过ajax访问服务器端的资源将会报跨域错误: XMLHttpRequest cannot load http://www.test2.com/test.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.test

No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案

No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏览器报如上错误.这是出于安全的考虑,默认禁止跨域访问导致的. 一.什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求数据,否则就是不安全的.跨域访问违反

[转]No 'Access-Control-Allow-Origin' header is present on the requested resource.'Ajax跨域访问解决方案

原 https://blog.csdn.net/zhoucheng05_13/article/details/53580683 No 'Access-Control-Allow-Origin' header is present on the requested resource. 什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求数据,否则就是不安

Chrome浏览器开启Ajax跨域访问调试

由于浏览器安全性限制,Ajax是不能跨域访问的,而我们在日常开发工作中,经常会出现本地开发环境需要访问其他服务器上的API情况.提示信息为: Access to XMLHttpRequest at 'http://****' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 在当今前后端分