现在的位置: 首页 > 综合 > 正文

jquery 跨域调用wcf 返回json 碰到的一些问题

2012年02月04日 ⁄ 综合 ⁄ 共 3699字 ⁄ 字号 评论关闭

走到这里的时候,发现网络上能学习的资源或是比较适合自己项目的文章越来越少了,也在这里停留了比较长的时间

在做跨域的过程中,感觉http://localhost:9090/域与http://localhost/这是属于同样的域,或是说这样的试验没法证明是跨域

试验的过程中,建议先测试一些简单的例子,比如在服务器先放一些ASP页面直接能返回内容的,且不存在逻辑过程的,这样可以更直观的发现问题

 

Code

 

以上是我放在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

            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

 

[WebGet(ResponseFormat = WebMessageFormat.Json,  BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        
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;
        }

 

这样基本上就OK了。

 

 

抱歉!评论已关闭.