Выполнение некоторого проигрывания называет мой сервис, который находится на другом домене с помощью jQuery. Вызов к сервису успешно выполняется (моя точка отладки смещена), и корректный ответ возвращается (я осуществляю сниффинг трафика).
Моя проблема состоит главным образом в том, что успех и обратные вызовы отказа не становятся запущенными. Я прочитал некоторые другие сообщения на том, Так, чтобы указали, что ошибочное событие не запущено при использовании JSONP. Это случай с событием успеха (возможно, потому что предполагается, что я обеспечиваю свою собственную функцию обратного вызова) также или есть ли способ запустить мой обратный вызов успеха.Заранее спасибо.
$.ajax({
type: "GET",
url: urlOnDiffDomain,
async: false,
cache: false,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
error: function(xhr, ajaxOptions, thrownError) {
alert('failed....');
}
});
Хорошо. На случай, если кому-то понадобится знать в будущем ... Оглядываясь назад, возможно, решение должно было быть более очевидным, чем было, но вам нужно, чтобы веб-ответ записывался непосредственно в поток ответа . Простое возвращение строки JSON этого не делает, вам нужно, чтобы кто-то построил ее и отправил обратно. Код в моем исходном сообщении будет работать нормально, если вы действительно это сделаете.
Пример служебного кода:
public void DoWork()
{
//it will work without this, but just to be safe
HttpContext.Current.Response.ContentType = "application/json";
string qs = HttpContext.Current.Request.QueryString["callback"];
HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}
Для ясности это код на стороне клиента.
function localDemo(){
$.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
function(data){
$.each(data, function(i,item){
alert(item.x);
});
});
}
Если есть лучший способ сделать это, я все слышу. Для всех остальных я знаю, что в WCF 4.0 есть некоторая концепция встроенной поддержки JSONP. Кроме того, вы можете сделать небольшую проверку в целях безопасности - хотя я не особо исследовал.
Метод обратного вызова success
вызывается, когда сервер отвечает. Метод $. Ajax
устанавливает функцию, которая обрабатывает ответ, вызывая метод обратного вызова success
.
Наиболее вероятная причина того, что метод success
не вызывается, заключается в том, что ответ сервера неверен. Метод $. Ajax
отправляет значение в строке запроса обратного вызова
, которое сервер должен использовать в качестве имени функции в ответе JSONP. Если сервер использует другое имя, функция, установленная методом $. Ajax
, никогда не вызывается.
Если сервер не может использовать значение в строке запроса обратного вызова
для установки имени функции в ответе, вы можете указать, какое имя функции должно ожидать метод $. Ajax
с сервера.Добавьте свойство jsonpCallback
к объекту option и установите значение имени функции, которую сервер использует в ответе.
Если, например, метод $. Ajax
отправляет запрос на сервер с использованием URL-адреса http://service.mydomain.com/getdata?callback=jsonp12345
, сервер должен ответить примерно так:
jsonp12345({...});
Если сервер игнорирует строку запроса обратного вызова
, а вместо этого отвечает примерно таким:
mycallback({...});
Тогда вам придется переопределить имя функции, добавив свойство в объект параметров:
$.ajax({
url: urlOnDiffDomain,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
jsonpCallback: 'mycallback'
});
Попробуйте
$.getJSON(urlOnDiffDomain, function(data, textStatus){
alert('success...');
});
Обычно у меня работает. Вам нужно добавить & callback =? на urlOnDiffDomain, где jQuery автоматически заменяет обратный вызов, используемый в JSONP.
Обратный вызов ошибки не запускается, но вы можете использовать глобальную $ .ajaxError, например
$('.somenode').ajaxError(function(e, xhr, settings, exception) {
alert('failed');
});