Я изо всех сил пытался заставить свой вызов jQuery к webmethod работать. Я возвращаюсь сервером с "401 Несанкционированным" ответом. У меня должна быть неправильная установка в web.config или где-то в другом месте который предотвратил бы успешный вызов.
Ваше понимание ценится!
button.OnClickAction = "PageMethod('TestWithParams', ['a', 'value', 'b', 2], 'AjaxSucceeded', 'AjaxFailed'); return false;";
function PageMethod(fn, paramArray, successFn, errorFn) {
var pagePath = window.location.pathname;
var urlPath = pagePath + "/" + fn;
//Create list of parameters in the form:
//{"paramName1":"paramValue1","paramName2":"paramValue2"}
var paramList = '';
if (paramArray.length > 0) {
for (var i = 0; i < paramArray.length; i += 2) {
if (paramList.length > 0) paramList += ',';
paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
}
}
paramList = '{' + paramList + '}';
//Call the page method
$.ajax({
type: "POST",
url: pagePath + "/" + fn,
contentType: "application/json; charset=utf-8",
data: paramList,
timeout: 10000,
dataType: "json",
success: function(result) { alert('Overjoyed'); },
error: function(result) { alert('No joy'); }
});
}
public partial class WebLayout : System.Web.UI.Page
{
[WebMethod()]
public static int TestNoParams()
{
return 1;
}
[WebMethod()]
public static string TestWithParams(string a, int b)
{
return a + b.ToString();
}
...
json: {"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}
и
"NetworkError: 401 Unauthorized - http://localhost/Care-Provider-Home/Profile/Personal-Profile.aspx/TestWithParams" TestWithParams
Я посмотрел на и считал обычные сайты на предмете (Encosia, и др.), но помочь. Или я пропускаю критическую часть, или существует некоторая тонкость в параметрах безопасности моей среды то предотвращение вызова.
Вот некоторые другие потенциально полезные лакомые кусочки, которые могут повлиять на Ваш диагноз:
Я с нетерпением жду Вашего понимания и направления - спасибо!
Да, заработало! Поскольку Sitecore CMS действительно выполняет перезапись URL-адресов для создания удобных URL-адресов (она собирает страницы в слои, динамически, аналогично концепции главной страницы), мне пришло в голову, что это может вызвать некоторую проблему, изначально вызвавшую ошибку 401. Я проверил это, создав отдельный проект с одним ASPX - и с некоторой работой я смог вызвать веб-методы и получить значения с помощью jquery. Затем я создал почти идентичный ASPX в своем веб-корне, но сказал Sitecore игнорировать его, когда к нему поступает запрос (IgnoreUrlPrefixes в web.config), после некоторой работы мне также удалось заставить его работать успешно! Спасибо за вашу помощь.
Какую форму аутентификации вы используете, если таковая имеется? Первое, что приходит на ум, это убедиться, что ваш webApp в IIS настроен на разрешение анонимных пользователей (если вы действительно хотите сделать звонок как анонимный пользователь). Также убедитесь, что режим аутентификации в web.config не установлен по ошибке на Windows. Если вы не можете разрешить анонимных пользователей и используете аутентификацию форм, то пользователь должен будет войти в систему до того, как этот вызов будет сделан с вашей страницы.
Если все вышеперечисленные параметры установлены правильно, попробуйте сделать обычный вызов службы со стороны сервера, чтобы убедиться, что проблема не меняется независимо от точки вызова службы.
Опубликуйте дополнительные настройки, если проблема не будет решена. Надеюсь, это поможет.
ANY
(или его синоним SOME
) является синтаксическим сахаром для EXISTS
с простой корреляцией:
SELECT *
FROM mytable
WHERE x <= ANY
(
SELECT y
FROM othertable
)
совпадает с:
SELECT *
FROM mytable m
WHERE EXISTS
(
SELECT NULL
FROM othertable o
WHERE m.x <= o.y
)
При условии равенства в поле, не допускающем значения null, он становится похож на IN
.
Все основные базы данных, включая SQL Server
, MySQL
и PostgreSQL
, поддерживают это ключевое слово.
Я не уверен, что есть способ получить выходные данные уже запущенного процесса
. Однако можно выполнить рефакторинг кода, чтобы не записывать его в Console.WriteLine
, а вместо этого принять экземпляр TextWriter
и записать в него.
В производстве можно просто передать метод Console.Out
. В тестовом коде можно издеваться над этим типом и обеспечить гораздо более точное тестирование. Например,
[TestMethod]
public void OutputTest()
{
var writer = new Mock<TextWriter>(MockBehavior.Strict);
writer.Setup(x => x.WriteLine("expected output")).Verifiable();
MySnazzyMethod(writer.Object, "input", 1, 'c');
writer.Verify();
}
Производственный код
MySnazzyMethod(Console.Out, "input", 1, 'c');
-121--4012970- Ответ json с консоли Firebug предоставляет наиболее информативную подсказку IMO. System.InvalidOperationException (которая странно едет на ответе 401) предполагает, что что-то большее находится в работе.
Во-первых, гуглинг на веб-методе jquery InvalidOperationException возвращает статьи, которые предполагают, что проблемы сериализации могут вызвать это исключение. Чтобы исключить это, временно измените «data: paramList» на «data:» {} «». Кроме того, подключите отладчик и проверьте, происходит ли исключение до выполнения метода или после его завершения и пытается ли он сериализовать результат.
Если шаги, описанные выше, окажутся пустыми, может понадобиться переустановить чистый файл web.config или прочитать дополнительные результаты поиска «InvalidOperationException webmethod»