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

工具说明:vs2012,sql server 2008R2html

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

   问题:因为web项目和wcf服务,不在同一个端口之中,因此涉及到“跨域”的问题。跨域访问的时候,须要对服务的接口和方法作必定的限定。具体参考:http://www.cnblogs.com/yangbingqi/p/2096197.htmlajax

 

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

 

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这个方法,一直调用失败。我怀疑可能的问题以下:json

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

        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语句,则可能能更快的定位到是因为数据库访问的问题而形成的。因此,异常捕获使用真的是技巧活。

 

   最后附上实例【我要下载

相关文章
相关标签/搜索