2010-04-28 127 views
1

編輯工作:起初我以爲是不工作跨域可言,現在我意識到它只能在IEJSONP跨域只能在IE

工作

我使用jQuery來調用Web服務(ASP.NET .axmx),並試圖給我們jsonp,以便我可以在不同的網站上調用它。目前它只能在IE中使用,但不能在Firefox,Chrome,Safari中使用。此外,在IE瀏覽器中,彈出一個對話框警告:「此頁正在訪問不受其控制的信息...」 任何想法?

下面是代碼:

$.ajax({ 
    type: "POST", 
    url: "http://test/TestService.asmx/HelloWorld?jsonp=?", 
    dataType: "jsonp", 
    success: function(data) { 
     alert(data.prop1); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert(XMLHttpRequest.status + " " + textStatus + " " + errorThrown); 
    } 
}); 

而且服務器代碼:

[ScriptService] 
public class TestService : System.Web.Services.WebService{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public void HelloWorld() { 
     string jsoncallback = HttpContext.Current.Request["jsonp"]; 
     var response = string.Format("{0}({1});", jsoncallback, @"{'prop1' : '" + DateTime.Now.ToString() + "'}"); 
     HttpContext.Current.Response.Write(response); 
    } 
} 
+1

,你能告訴我如何你從jQuery側進行調用(我想你是如何注入相應的腳本元素)? – 2010-04-28 15:31:39

+1

這可能是一個紅鯡魚,給所有其他事情發生,但爲什麼你指定POST而不是GET? – 2010-04-29 10:44:50

+0

@馬特吉布森...那有效!如果你想把它寫成答案,我會接受它。爲什麼這很重要? – iboeno 2010-04-29 20:48:10

回答

2

很高興現在正在工作。

您試圖將參數「jsonp」 - 您需要傳遞給json的「padding」部分 - 作爲GET參數,即在URL字符串中。哪一個是正確的。

但是因爲您指定了POST,所以沒有發生。實際上,由於您指定了POST,因此服務器期望所有參數都位於POST數據中,而不是GET變量中,因此它不檢查URL以檢索參數。因爲(a)如果服務器沒有讀取「jsonp」變量,我認爲jQuery對於如何進行JSON評估是相當寬容/聰明的,因此仍然在IE中工作,因爲它會發回"({'prop1' : '<today's date>'})",它仍然可以評估爲JSON,並且(b)IE對跨站點腳本(「同源」策略)沒有與其他瀏覽器相同的限制。但我需要調試它確定。

我建議在Firefox中使用FireBug來調試將來發生的這類請求,但主要的收穫是如果您要將參數作爲URL的一部分發送,請使用GET,而不是POST。

乾杯,

馬特

+0

感謝您的解釋! – iboeno 2010-05-03 13:31:51

0

除非指定jsonp和/或jsonpCallback選項,jQuery的爲你自動生成的函數名,並添加了一個查詢參數,如callback=jsonp1272468155143。這意味着您的應用程序需要使用該函數名稱進行輸出。

您可以隨時將jsonpCallback設置爲test,在這種情況下您的示例可以工作。