Запрос AJAX не работает с ASP.Net С# - ошибка сервера 500

Я попробовал код этого метода страницы на своей странице ASPX (ShowUsers.aspx), но функция выдала ошибку сервера 500 и не переходит к обработчику success.

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string GetInfo(string email)
{
    JavaScriptSerializer jss = new JavaScriptSerializer();
    User user = UserService.GetUser(email);
    return jss.Serialize(user);
}

И JavaScript:

$(document).ready(function() {
  $("#l").click(function() {
    $("#modalUpdate").fadeIn(1000);
    var url = "ShowUsers.aspx/GetInfo";
    var email = "[email protected]";

    $.ajax({
      url: url,
      type: "POST",
      data: "{ email : " + email + " }",
      dataType: "JSON",
      contentType: "application/JSON; charset=utf-8",
      success: function(msg) {
        alert("success");
        var data = JSON.parse(msg.d);
        // do stuff (trimmed)
      },
      error: function(msg, xhr) {
        alert(msg + ", " + xhr.responseText);
      }
    });
  });
});

Может кто-то мне помочь, пожалуйста?


person David Izhaki    schedule 20.02.2018    source источник


Ответы (3)


Ваш JSON недействителен, поскольку вы не заключили строку адреса электронной почты внутри кавычек в JavaScript. .

Программное доказательство того, что это вызовет исключение на стороне сервера:

void Main()
{
    string email = "[email protected]";
    var postback = new Postback { email = email };

    Console.WriteLine(new JavaScriptSerializer().Deserialize<Postback>("{ email : '" + email + "' }")); // email string escaped, ok
    Console.WriteLine(new JavaScriptSerializer().Deserialize<Postback>("{ email : " + email + " }")); // YOUR INPUT, exception Invalid JSON primitive
}

public class Postback
{
    public string email { get; set; }
}

Исключение на стороне сервера проявляется как внутренняя ошибка сервера, код 500. Вы должны иметь возможность видеть сведения об исключении в средстве просмотра событий Windows.

Итак, в JavaScript просто заключите адрес электронной почты в кавычки:

data: "{ email : '" + email + "' }",

Также обратите внимание, что все, что вам нужно для тела вашего веб-метода, это

public static User GetInfo(string email) {
   return UserService.GetUser(email);
}

т. е. вам НЕ нужно запускать сериализатор самостоятельно. Платформа выбирает и запускает необходимый сериализатор (JSON или XML) на основе заголовков запроса.

person Stephen Kennedy    schedule 20.02.2018

Вызов AJAX возвращает код состояния 500. Это определенно ошибка кода C#, а не JavaScript.
Код состояния 500 означает Внутренняя ошибка сервера. Приложения ASP.NET выбрасывают этот код при возникновении любого исключения. Посмотрите в своих журналах/выводе консоли на стороне С#.

Я предполагаю, что проблема в названии метода. Если не указано иное, из-за соглашений об именах ASP.NET ваш GetInfo можно вызывать с помощью метода GET. Вы вызываете эту конечную точку с помощью POST, попробуйте изменить ее на GET.

Кроме того, попробуйте другие комбинации URL, например:

  • ShowUsers/GetInfo
  • ShowUsers.aspx/Info
  • ShowUsers/Info
person Mario Cianciolo    schedule 20.02.2018

Создайте новую страницу и получите данные с этой страницы вместо получения с той же страницы в asp.net. Неправильно вызывать

`"ShowUsers.aspx/GetInfo";`

попробуйте это с новой страницей

`showUsersAjax.aspx'`

и убедитесь, что ваш URL-адрес должен быть похож на

var url = "http://www.doamin.com/ShowUsers.aspx/GetInfo";

попробуй это

var url = "http://www.doamin.com/ShowUsers/GetInfo";

Предполагая, что ShowUsers является контроллером, а GetInfo является дополнительным действием, добавьте подпись POST в свой API.

person Aay Que    schedule 20.02.2018
comment
Относительный URL абсолютно удобен и во многих случаях более логичен. Это не «неправильно» использовать их вообще. Хотя OP, вероятно, должен основывать их на корне домена. - person Rory McCrossan; 20.02.2018
comment
моему другу это понравилось, и у него это хорошо работает, я сейчас рядом с ним ... - person David Izhaki; 20.02.2018
comment
@DavidIzhaki вы не можете вызывать метод в aspx, однако это можно сделать в mvc. - person Aay Que; 20.02.2018
comment
@AayQue, у моего друга рядом со мной есть такой же проект, как у меня, и он работает на него прямо сейчас... - person David Izhaki; 20.02.2018
comment
Нет, это называется метод страницы, и он совершенно логичен и законен в классическом ASP.NET. - person Stephen Kennedy; 20.02.2018