У меня есть SoapExtension, которое предназначено для регистрации всех запросов и ответов SOAP. Он прекрасно работает для вызовов из приложения, использующего MS Soap Toolkit (OnBase Workflow). Но это не работает для вызовов, сделанных $ .ajax () на html-странице. Вот пример:
$.ajax({
type: "POST",
url: url,
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json"
});
Он вызывает веб-сервис ASP.NET 3.5, помеченный атрибутами WebService и ScriptService:
[WebService(Namespace = XmlSerializationService.DefaultNamespace)]
[ScriptService]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class DepartmentAssigneeService : WebService
{
private readonly DepartmentAssigneeController _controller = new DepartmentAssigneeController();
/// <summary>
/// Fetches the role items.
/// </summary>
/// <returns></returns>
[WebMethod]
[SoapLog]
public ListItem[] FetchDepartmentItems()
{
return CreateListItems(_controller.FetchDepartments());
}
}
А вот основные сведения об атрибутах SoapExtension и SoapExtensionAttribute:
public class LoggingSoapExtension : SoapExtension, IDisposable { /*...*/ }
[AttributeUsage(AttributeTargets.Method)]
public sealed class SoapLogAttribute : SoapExtensionAttribute { /*...*/ }
Я что-то упустил, что позволило бы LoggingSoapExtension выполнять запросы $ .ajax ()?
Обновление
@ Крис Брандсма
Возможно, это связано с тем, что вы запрашиваете результаты Json вместо XML через ваш веб-сервис (dataType: "json"). Таким образом, атрибут ScriptService активируется, но вы не отправляете SOAP-сообщения.
Это отвечает, почему SoapExtension не работает. Есть предложения по отслеживанию с помощью ScriptService? Единственное, что приходит на ум, - это базовый класс ScriptService, который предоставляет метод для регистрации запроса. Но тогда мне придется вызывать этот метод в каждом WebMethod в каждом ScriptService WebService (у меня их немало). Я хотел бы использовать что-то простое и понятное, как атрибут SoapExtension, если это возможно.