jquery 跨域調用wcf 返回json 碰到的一些問題

來源:互聯網
上載者:User

走到這裡的時候,發現網路上能學習的資源或是比較適合自己項目的文章越來越少了,也在這裡停留了比較長的時間

在做跨域的過程中,感覺http://localhost:9090/域與http://localhost/這是屬於同樣的域,或是說這樣的實驗沒法證明是跨域

實驗的過程中,建議先測試一些簡單的例子,比如在伺服器先放一些ASP頁面直接能返回內容的,且不存在邏輯過程的,這樣可以更直觀的發現問題

 

Code
<%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

 

[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了。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.