zoukankan      html  css  js  c++  java
  • 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语句,则可能能更快的定位到是由于数据库访问的问题而造成的。所以,异常捕获使用真的是技巧活。

       最后附上实例【我要下载

  • 相关阅读:
    MySQL字符集 utf8 和 utf8mb4 区别及排序规则 general_ci 和 unicode_ci 和 bin 的区别
    tp5定时任务
    PHP7.X连接SQLSERVER数据库(CENTOS7)
    php 连接sqlserver
    接口踩坑:Status (blocked:other)
    php 一些常用函数
    tp5支付宝和微信支付
    php 数组相关方法的一些实际妙用
    MySQL如何利用索引优化ORDER BY排序语
    composer命令介绍之install和update及其区别
  • 原文地址:https://www.cnblogs.com/zzPrince/p/4525017.html
Copyright © 2011-2022 走看看