工具說明:vs2012,sql server 2008R2html
1.首先,經過vs2012創建一個wcf服務項目,創建好以後。再新開一個vs2012 創建web項目,經過jQuery的ajax方法訪問服務。web
問題:因爲web項目和wcf服務,不在同一個端口之中,因此涉及到「跨域」的問題。跨域訪問的時候,須要對服務的接口和方法作必定的限定。具體參考:http://www.cnblogs.com/yangbingqi/p/2096197.htmlajax
2.解決了跨域問題,咱們須要把服務部署到IIS。vs2012的部署比較簡單,不贅述。sql
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這個方法,一直調用失敗。我懷疑可能的問題以下:json
1).wcf配置錯誤,wcf配置複雜,本人對此也不熟悉,不知其深淺,因此剛開始一致糾結因而否爲wcf配置在IIS中有問題。windows
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語句,則可能能更快的定位到是因爲數據庫訪問的問題而形成的。因此,異常捕獲使用真的是技巧活。
最後附上實例【我要下載】