2012-02-27 3 views
2

У меня есть метод .Ajax, который вызывает метод на странице позади (выполняет некоторую логику, затем вызывает службу WCF, а затем возвращает объект), которая выглядит так:. Метод Ajax работает на локальной машине, но не на сервере

$.ajax({ 
      type: 'POST', 
      url: 'MyPage.aspx/TestMethod', 
      dataType: "json", 
      contentType: "application/json", 
      data: "{'Id': '" + Id + "'}", 
      success: function (data) { 
       $("#randomElement").html(data.d.Foo); 
      }, 
      error: function ((xhr, textStatus, error){ 
      alert(xhr.statusText); 
      alert(textStatus); 
      alert(error); 

     }); 

И страница за:

[System.Web.Services.WebMethod] 
     public static MyObject TestMethod(string Id) 
     { 
      //Logic removed for readability! 

      return MyService.GetStuff(Id); 

     } 

Это отлично работает на моем локальном компьютере, но не работает, когда я раскрываю к серверу.

Я определил, что метод, стоящий за страницей, не вызван (т. Е. Ошибка вызывает вызов TestMethod(), а не вызов TestMethod()).

Я также поставил предупреждение перед методом .ajax, чтобы показать мне путь к странице, на которой я нахожусь, на всякий случай, когда он делал что-то смешное с uri на реальном сервере, и он возвращается как «/ MyPage .aspx ", как я и ожидал.

Я также изменил «url:» на полный uri, чтобы увидеть, помогло ли это, и это не так.


После запуска скрипача с пользовательскими ошибками выключен, я получаю следующее сообщение об ошибке:

{"Message":"Thread was being aborted.","StackTrace":" at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)\r\n at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)\r\n at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)\r\n at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary 2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary 2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.Threading.ThreadAbortException"}

+0

Должен ли url быть 'MyPage.asmx/TestMethod' вместо' MyPage.aspx/TestMethod'? –

+0

Какой ответ вы получаете от запроса ajax, когда он терпит неудачу на сервере? Он возвращает 200, 404, 500, что-то еще? – kendaleiv

+0

@JohnPick Нет, вызов заключается в веб-странице aspx позади, а не в веб-службе asmx. – Ben

ответ

0

Мне кажется, что это не размещая правильные параметры для вашего метода.

Я никогда не использовал параметр данных в методе .ajax, как вы это делали раньше. Я использую:

data: {Id: myId}, 

Где myId - переменная, содержащая значение идентификатора, которое вы хотите передать, без кавычек.

Обычно это что-то относящееся к строкам кодирования, которое не должно быть здесь актуальным, и кажется, что вы передаете строковые данные: «{'Id': '" + Id + " '} "вместо объекта.

1

Ваш JSON недействителен; вам необходимо использовать двойные кавычки:

data: '{"Id": "' + Id + '"}', 
+0

И я не знаю, почему то, что у вас есть, будет работать на вашей локальной машине. Это сбивает с толку. – JayC

0

Есть ли у вашего сервера «json»? godaddy, например, не предлагает его

+0

вы получили ответ? – Andrew

Смежные вопросы