Править: Сначала я думал, что это не работало перекрестный домен вообще, теперь я понимаю, что это только работает в IE
Я использую jQuery для вызова веб-сервиса (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);
}
}
Рад, что теперь он работает.
Вы пытаетесь отправить параметр "jsonp", который необходимо передать для "дополнения" json, в качестве параметра GET, то есть в строке URL-адреса. Что делать правильно.
Но поскольку вы указали POST, этого не происходит. Фактически, поскольку вы указываете POST, сервер ожидает, что все параметры будут в данных POSTed, а не в переменных GET, поэтому он не проверяет URL-адрес для получения параметра.
Я думаю, что вполне возможно, что jQuery довольно снисходительно относится к тому, как он выполняет оценку JSON, и, следовательно, все еще работает в IE, потому что (а) если сервер не читает переменную "jsonp", я думаю, что это отправлю обратно "({'prop1': '
, который по-прежнему может быть оценен как JSON, и (b) IE не имеет таких же ограничений на кросс -сайтовый скриптинг (политика «того же происхождения»), что и в других браузерах. Но мне нужно отладить его, чтобы быть уверенным.
Я бы посоветовал использовать FireBug в Firefox для отладки того, что происходит с такого рода запросами в будущем, но главный вывод заключается в том, что если вы отправляете параметры как часть URL-адреса, используйте GET, а не POST. .
Ура,
Мэтт
Если вы не укажете параметр jsonp
и / или jsonpCallback
, jQuery автоматически сгенерирует имя функции и добавит параметр запроса, например callback = jsonp1272468155143
. Это означает, что ваше приложение должно выводить данные с использованием этого имени функции.
Вы всегда можете установить jsonpCallback
на test
, и в этом случае ваш пример будет работать.