走到這裡的時候,發現網路上能學習的資源或是比較適合自己項目的文章越來越少了,也在這裡停留了比較長的時間
在做跨域的過程中,感覺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了。