Полагаю, это зависит от того, какой уровень контроля вы хотите иметь над тем, что происходит во время вызова AJAX. Веб-методы, безусловно, будут работать, но то, что я использовал в недавнем проекте, - это создание обработчика .ASHX для отдельных функций, которые вы хотите использовать в своих вызовах AJAX. У вас по-прежнему есть доступ к любым переменным контекста, таким как запрос, ответ, строка запроса, сеанс и т. Д., И логика хорошо инкапсулирована вне любых страниц, и вы также не получаете накладных расходов на «нормальную» обработку страницы и жизненный цикл, улучшить производительность.
Просто будьте осторожны при установке уровней кэширования, поскольку обработчики ASHX по умолчанию кажутся очень «кэшируемыми».
Пример, ashx, чтобы получить всех сотрудников на определенную должность и вернуть результаты в формате JSON:
public class GetEmployeesForPosition : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.Clear();
context.Response.AddHeader("Pragma", "no-cache");
context.Response.AddHeader("Expires", "-1");
var position = new Entity.Model.Position { Code = context.Request.QueryString["code"] };
var language = new Language { Key = context.Request.QueryString["language"] };
var list = new EmployeeManager().GetForPosition(position, language);
var employeeMenuList = new List<KeyValuePair<string, string>>();
foreach (var emp in list)
{
var item = new KeyValuePair<string, string>(emp.Person.Number, emp.Person.DisplayName);
employeeMenuList.Add(item);
}
var json = JsonSerializer.ToJson(employeeMenuList);
context.Response.Write(json);
}
public bool IsReusable
{
get
{
return true;
}
}
}