2016-01-14 65 views
0

我在Visual Studio 2013中創建了一個web.api解決方案。預測跨域問題我安裝了WebApiContrib.Formatting.Jsonp Nuget包。我在解決方案中創建了一個Web應用程序,該應用程序從jquery調用web.api服務。通常我的Ajax請求的樣子:如何從IIS 8.5中的web.api站點返回jsonp?

var request = $.ajax({ 
    url: uri + '/api/events/', 
    type: 'GET', 
    dataType: 'jsonp', 
    crossDomain: true 
}); 

本來我開始在Windows 7中的項目,最近已升級到Windows 10,這一切都在本地VS工作正常,2013/IIS快遞 - 的web.api返回一個JSON調用腳本的事件數組。我還將web.api項目發佈到在IIS 10下運行的本地網站,所有這一切都很好。

因此,我將web.api部署到開發服務器 - 運行IIS 8.5的Windows Server 2012 R2。當我要求http://devservername/api/events/我得到一個錯誤:沒有請求中提供的回調參數URI

Error Image - A callback parameter was not provided in the request URI

開發服務器asp.net 4.5中運行。我擔心我無法在本地處理回調參數,但是此技術在目標服務器上失敗。或者更糟的是,這是一個部署/配置問題。任何人都可以在這裏推薦最佳方法嗎

謝謝。

+0

你檢查控制檯,以確認回調參數被列入請求URI? –

+0

我不是因爲直接從Internet Explorer調用web.api方法時發生錯誤。追加?回調=請求提供了一些有用的反饋。 – shanderson

回答

0

我做了一些更多的挖掘,並添加了一些錯誤日誌記錄和跟蹤到web.api項目。事實證明,顯示的錯誤是正確的 - 當試圖從Internet Explorer訪問web.api方法時,除非提供了回調參數,否則會發生此錯誤(因爲它應該)。 Chrome和Firefox愉快地顯示數據源的XML版本。在IE中,如果有人追加?callback = something,那麼IE將嘗試返回數據。 jQuery通過在AJAX請求中自動附加回調參數來隱藏所有這些。

如果一個試圖調用從C#服務器端的web.api方法,然後附加在調用這個參數是必須的:

 using (WebClient wc = new WebClient()) 
     { 

      // wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
      wc.Headers.Add("Accept", "application/jsonp"); 
      NameValueCollection nvc = new NameValueCollection(); 
      nvc.Add("callback", "jsonCallback"); 
      wc.QueryString = nvc; 

      try 
      { 
       string result = wc.DownloadString(MyWebApiUrl); 
       var json = System.Text.RegularExpressions.Regex.Match(result, @".+\((.+)\).+").Groups[1].Value; 
       events = JsonConvert.DeserializeObject<Event[]>(json); 
      } 

      catch (Exception) 
      { 
       events = new Event[] { }; 
      } 
     }