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语句,则可能能更快的定位到是由于数据库访问的问题而造成的。所以,异常捕获使用真的是技巧活。
最后附上实例【我要下载】
Ajax跨域访问wcf服务中所遇到的问题总结。的更多相关文章
- ajax跨域访问http服务--jsonp
在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...
- 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法
关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...
- 浅析JSONP-解决Ajax跨域访问问题
浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...
- Ajax跨域访问解决办法
方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...
- Web Api 2(Cors)Ajax跨域访问
支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...
- Ajax跨域原理及JQuery中的实现
浅析Ajax跨域原理及JQuery中的实现分析 AJAX 的出现使得网页可以通过在后台与服务器进行少量数据交换,实现网页的局部刷新.但是出于安全的考虑,ajax不允许跨域通信.如果尝试从不同的域请 ...
- 关于JQuery Ajax 跨域 访问.net WebService
关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...
- ajax跨域访问的解决方案
今天的工作中要访问摄像机内部的一个web站点,这就涉及到jquery的ajax跨域访问的问题.我使用的是jquery1.7的版本,下面总结如下: 问题一:一开始用IE调试,总是返回No Transpo ...
- Hbuilder编辑App时,ajax跨域访问失败问题
今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...
随机推荐
- vue.js 的学习
官方网站(作者居然是中国人) http://vuejs.org/ Vuex中文手册 http://vuex.vuejs.org Vue-Router 手册 http://router.vuejs.or ...
- 学习笔记——SQLite介绍
简介:Google为android的较大数据的处理提供了SQLlite, 他在数据存储.管理.维护.等各方面都相当出色功能也非常强大. 1.创建数据库 Android 为了让我们能够更加方便地管理数据 ...
- 《微软互联网信息服务(IIS) 最佳实践》已上市,欢迎选购!
本书内容涵盖了IIS6.0~IIS 10.0 的全部主流IIS 版本,是多年微软技术支持经验的结晶.祝您顺利排除Web 服务器的疑难杂症! 本书由微软亚太区全球技术支持中心IIS 方面的顶尖专家金鑫作 ...
- 移动开发可能用到的css单位
众所周知CSS技术我们虽然很熟悉,在使用的过程却很容易被困住,这让我们在新问题出现的时候变得很不利.随着web继续不断地发展,对于新技术新 解决方案的要求也会不断增长.因此,作为网页设计师和前端开发人 ...
- c#解析XML到DATASET及dataset转为xml文件函数
//将xml对象内容字符串转换为DataSet public static DataSet ConvertXMLToDataSet(string xmlData) { ...
- JAVA的continue用法
JAVA的continue用法: public class test{ public static void main(String [] args){ for(int i=0;i<=10;i ...
- SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/MyEclipseWorkSpace/Emps/WebRoot/WEB-INF/lib/slf4j-nop-1.5.6.
错误的是HQL语句,注意写类名属性名无误,条件无误.
- 常用SQL[ORACLE]
1.常用系统函数 2.常用sql语句 3.一些定义和关键字 4.需要注意点 1.常用系统函数 ↑ --decode decode(column,if_value,value,elseif_ ...
- ABP理论学习之依赖注入
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...
- 操作系统核心原理-7.设备管理:I/O原理
一.I/O的基本知识 1.1 为何要有I/O 前面阐述了操作系统具有进程管理.内存管理.外存管理三大核心功能,但是计算机归根是为人类服务的,这就要求计算机必须提供某种机制使得人们可以向计算机发出命令或 ...