走到这里的时候,发现网络上能学习的资源或是比较适合自己项目的文章越来越少了,也在这里停留了比较长的时间
在做跨域的过程中,感觉http://localhost:9090/域与http://localhost/这是属于同样的域,或是说这样的试验没法证明是跨域
试验的过程中,建议先测试一些简单的例子,比如在服务器先放一些ASP页面直接能返回内容的,且不存在逻辑过程的,这样可以更直观的发现问题
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
<%Response.Write(Request("callback"))%>({"_AirdromeBuildCost":0,"_DepDay":null,"_DepMonthEN":null,"_DepWeekEN":null,"_Distance":0,"_EndAirdromeEN":null,"_EndCityCN":null,"_FlightDate":"","_FuelTax":0,"_StartAirdromeCN":null,"_StartAirdromeEN":null,"_StartCityCN":null,"_endAirdromeCN":null,"_flightDateTime":"\/Date(1240716871875+0800)\/","_list":[],"_sourAvhCmd":""})
以上是我放在asp页面的内容,当然更建议您再简单些,比如<%Response.Write(Request("callback"))%>('abcdf'),jsonp的回调函数。在这里如果不是很了解json数据格式,及调用json数据的方式的朋友需要知道。
callback(json数据)这里的json数据不要用引号。
然后把该页面放在服务端,
本地调用。
我目前是使用jquery,主要是觉得他的轻巧。当然如果您的项目在内部运行,或整体加载速度等不是问题,且需要较好的UI,可以考虑EXTJS
在htm页面
第一,引用jquery的脚本文件
第二,html <button id="btnTest"> BtnTest</button>
有以下脚本
r参数是一个随机值,防止缓存的,其实跟踪客户端发出的数据会发现jquery会自动给该请求加上一个“_” 的参数,值是一个随机变量应该也是解决缓存的,
callback=?和下面的dataType:"json",如果dataType:"jsonp",那么就不需要加callback=?这个参数了,这个可以在服务端调试的时候发现到,
processData:false,默认是true,当我们的发送参数是传统的格式的时候,设置为false
ShowAv是回调函数,如果我们在服务端调试,在上面我们有看到服务端需要接收callback的参数,调试的时候会发现是一个类似jsonxxxxxx的值,在jquery里有明确的说明这个值即代表本文的ShowAv函数,
这样再认真查看服务端的代码,就会明白,服务端的代码实际上就是ShowAv('abcdf'),就是这样,也就是说,以下的脚本最终实现的一个目的与我们调用一个远程脚本文件(文件的内容是ShowAv('abcdf'))是一样的效果。这就是jsonp的原理所在。(有人说jsonp早就存在就是这个意思。)
Code
$(document).ready(function() {
var oBtnTest = $("#btnTest");
oBtnTest.click(function() {
$.ajax({
type: "GET",
url: http://TicketSearch.XXX.net:9090/Ajax/AV/CmdAVAjaxP,
data: "CmdString=AVH/FOCPEK/D&r=" + Math.random() * 150 + "&callback=?", //调用服务所需要的参数
contentType: "text/json; charset=utf-8",
dataType: "json",
processData: false,
success: ShowAv
});
});
});
function ShowAv(data) {}
以上的ShowAv函数,您可以添加任意您想要的测试脚本。
以上内容主要是针对初学者,进行跨域的测试,以及json数据的测试。
下面主要涉及的内容是wcf数据的提供。
这里提到的方法主要是针对跨域的WCF服务,如果没有跨域的WCF服务不需要如果此复杂。
在以上测试成功后,可以开始连接到我们提供WCF服务。
以下提供的服务方法,是支持http的get方法,返回的是Stream格式,AirFlights是这个服务原来返回的一个实体
被注释的部分是我曾尝试直接让WCF返回字符串格式,但在调试的时候会发现如果返回设置为json格式,整个字符串会被引号起来,下面的那种方法是借鉴了http://www.cnblogs.com/jillzhang/archive/2009/03/13/1245458.html
public Stream CmdAVAjaxP( string cmdString, string callBack)
{
if (String.IsNullOrEmpty(cmdString))
{
return null ;
}
AirFlights air = CmdAVSearch(cmdString);
//JsonQueryStringConverter jqsc = new JsonQueryStringConverter();
// string strRe = String.Format( " {1}({0}) " , jqsc.ConvertValueToString(air, typeof (AirFlights)), callBack);
// string strRe = jqsc.ConvertValueToString(air, typeof(AirFlights));
// return strRe;
System.Runtime.Serialization.Json.DataContractJsonSerializer formater = new System.Runtime.Serialization.Json.DataContractJsonSerializer( typeof (AirFlights));
MemoryStream ms = new MemoryStream();
formater.WriteObject(ms, air);
ms.Position = 0 ;
StreamReader sr = new StreamReader(ms);
string objContent = sr.ReadToEnd();
string returnStr = callBack + " ( " + objContent + " ) " ;
sr.Close();
ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.AutoFlush = true ;
sw.Write(returnStr);
ms.Position = 0 ;
WebOperationContext.Current.OutgoingResponse.ContentType = " text/plain " ;
return ms;
}