У меня есть вызов ajax, который работает нормально локально, но когда я опубликовал его на сервере, код никогда не выполняется, но в любом случае возвращает "200 OK". Код "успех" не выполняется, а код ошибки отсутствует. Здесь мой вызов ajax:
$.ajax({
type: "POST",
url: "/CargadorContadores.aspx/ObtenerContadores",
contentType: "application/json; charset=utf-8",
data: "",
async: false,
dataType: "json",
success: function(data) {
var myObj = JSON.parse(data.d);
for (var i = 0; i < myObj.length; i++) {
var element = document.getElementById("LbItem " + myObj[i].MenuItemID);
element.innerHTML = "<b>" + element.innerHTML + " (" + myObj[i].Cantidad + ")</b>";
}
},
error: function(xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
Я также попытался поместить полный url в поле "url", но все равно не повезло. Странно то, что когда я помещаю полный URL-адрес непосредственно в браузер, он все еще не выполняет код. И он отлично работает на месте!
Я знаю, что там есть аналогичная запись (jQuery $.ajax не работает без ошибок, сообщений об ошибках, а сервер ответил на 200 OK), но он не разрешен, и здесь он сходит с ума.
PD: это НЕ кросс-домен, мой код ajax находится в.ascx, и я пытаюсь вызвать метод на.aspx
Огромное спасибо!!!!
EDIT: Я попытался удалить ссылку System.web.extensions моего веб-проекта и добавить dll в мой bin, но он все еще не работает (версия 1.0.61025.0). Кроме того, я запускаю ASP.NET-сайт в IIS с фреймворком 2.0, и у меня нет фреймворка 3.5, установленного на моем сервере (но локально я это делаю). Может, проблема? Я не могу установить его из-за политики безопасности клиента, что мне делать?
EDIT 2: Я попытался сделать простой ответ из моего.aspx, просто чтобы проверить, была ли проблема в этом методе, но она все еще не выполняет функцию успеха. Вот мой код.aspx:
[WebMethod]
public static string ObtenerContadores()
{
return new JavaScriptSerializer().Serialize("true");
}
и адаптировал.ascx
$.ajax({
type: "POST",
url: "/CargadorContadores.aspx/ObtenerContadores",
contentType: "application/json; charset=utf-8",
data: "",
async: false,
dataType: "json",
success: function(dictionary) {
alert("hello");
},
error: function(xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
Я хочу поблагодарить всех за вашу помощь. Наконец, мне пришлось установить 3.5 Framework на сервере, у меня не было выбора. Второй я установил его и обновил ссылки dll web.config на 3.5, он работал как шарм.
Еще раз спасибо!!!!!
Если его VS2012, попробуйте добавить Mime Type Handler, поскольку VS2012 имеет IIS express и ему нужно добавить обработчик Mime-типа извне, добавьте ниже код в web.config
<system.webServer>
<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>
</system.webServer>
.. и если его не VS2012, то следуйте этой ссылке
Хорошо, я полагаю, что понял это, поэтому я оставляю второй ответ, чтобы сохранить предыдущее обсуждение.
Здесь исправление. Удалите эту строку:
contentType: "application/json; charset=utf-8",
В моем тестовом скрипте это вызвало jQuery для отправки application/json; charset=utf-8
заголовка Content-Type
application/json; charset=utf-8
application/json; charset=utf-8
, как и ожидалось, но фактическое содержимое запроса не было отправлено должным образом как JSON. Например, вместо отправки {"foo":"bar"}
, он отправил foo=bar
. В результате сценарий приема действовал так, как будто никаких данных не было опубликовано вообще. Когда я прокомментировал вышеприведенную строку, мой тестовый скрипт работал нормально и сделал все, что я ожидал, со значениями, полученными от целевого URL.
Обратите внимание, что это приведет к тому, что ваши данные будут опубликованы как обычные данные. Например, если ваш $.ajax()
выглядит так, опубликованные данные будут содержать переменную foo
и one named who
:
$.ajax({
...
data: {foo : "bar",
who : "what"},
...
});
Если вы хотите опубликовать уже сериализованный JSON, сделайте это так:
$.ajax({
...
data: { somevariablename: '{"foo":"bar","who":"what"}' },
...
});
Затем вам просто нужно проанализировать параметр POST somevariablename
на стороне сервера.
Надеюсь это поможет!
Вот ваша проблема: "Странно то, что когда я помещаю полный URL-адрес прямо в браузер, он все равно не выполняет код". Ваш JavaScript ожидает - требует ответа JSON и, по-видимому, вообще не получает ответа. Это не проблема JavaScript, а проблема с вашей страницей.aspx.
EDIT: основываясь на ваших комментариях ниже, ясно, что проблема в том, что ваша страница.aspx не возвращает то, что вы ожидаете. Поскольку.aspx не дает ожидаемого результата, даже если вы переходите к нему напрямую, проблема заключается в этой странице, а не в jQuery.
Представьте, что.aspx производит {}
, false
или true
. Ваш код success
будет запущен, но ничего не сделает. Попробуйте поставить alert("Foo");
там и наблюдайте, что происходит. Проблема заключается не в том, что ваш jQuery заблокирован; это то, что он не получает значимого ввода с вашей страницы.aspx.
PS Я бы рекомендовал использовать переменное имя, отличное от data
в вашей функции успеха, на всякий случай, если он будет испорчен атрибутом объекта data
в вашем вызове.ajax.