ASP.NET Вызов WebMethod с jQuery AJAX "401 (несанкционированный)"
Застрял с этим в течение нескольких часов
{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}
Я пытаюсь вызвать этот WebMethod в своей ASP.NET Webform
[WebMethod]
public static string GetClients(string searchTerm, int pageIndex)
{
string query = "[GetClients_Pager]";
SqlCommand cmd = new SqlCommand(query);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@SearchTerm", searchTerm);
cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
cmd.Parameters.AddWithValue("@PageSize", PageSize);
cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
return GetData(cmd, pageIndex).GetXml();
}
Из этого jquery.ajax
function GetClients(pageIndex) {
$.ajax({
type: "POST",
url: "ConsultaPedidos.aspx/GetClients",
data: '{searchTerm: "' + SearchTerm() + '", pageIndex: ' + pageIndex + '}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: OnSuccess,
failure: function (response) {
alert(response.d);
},
error: function (response) {
alert(response.d);
}
});
}
Но я всегда получаю эту ошибку:
POST http://localhost:64365/ConsultaPedidos.aspx/GetClients
401 (неавторизованный)
Странно, что это работало до тех пор, пока я не начал аутентифицировать пользователей
<system.web>
...
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" defaultUrl="/Dashboard" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
...
</system.web>
Есть идеи?
Ответы
Ответ 1
Задача решена
Это сводило меня с ума.
Внутри ~/App_Start/RouteConfig.cs изменить:
settings.AutoRedirectMode = RedirectMode.Permanent;
Для того, чтобы:
settings.AutoRedirectMode = RedirectMode.Off;
(Или просто прокомментируйте строку)
Кроме того, если включены дружественные URL-адреса, вам необходимо изменить
url: "ConsultaPedidos.aspx/GetClients",
Для того, чтобы:
url: '<%= ResolveUrl("ConsultaPedidos.aspx/GetClients") %>',
Надеюсь, это поможет кому-то еще
Ответ 2
Внутри ~/App_Start/RouteConfig.cs
изменить
settings.AutoRedirectMode = RedirectMode.Permanent;
в
settings.AutoRedirectMode = RedirectMode.Off;
Ответ 3
401 Несанкционированное означает, что:
- Аутентификация пользователя не была предоставлена или
- Он был предоставлен, но не прошел проверки подлинности
Это подтверждает то, что вы сказали о добавлении аутентификации, и это явно охватывает этот метод.
Поэтому вы хотите, чтобы доступ к этому методу был общедоступным или нет?
Публикация:
- Вам необходимо удалить аутентификацию из этого метода.
Чтобы разрешить доступ к общедоступным ресурсам (например, этот веб-метод), вы просто помещаете это в файл конфигурации в том же каталоге:
<authorization>
<allow users="*" />
</authorization>
если вы поместите выше тег, тогда он предоставит право доступа всем пользователям со всеми ресурсами. поэтому вместо этого вы можете добавить тег ниже, чтобы дать авторизацию веб-службе
<location path="YourWebServiceName.asmx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
Частный:
- Вы должны убедиться, что аутентификация отправляется по всей линии (с помощью Fiddler для проверки файла cookie) и убедитесь, что она передает аутентификацию asp.net.
Ответ 4
Не эксперт, но вы попробовали, поставив <allow users="*"/>
в файл конфигурации? В вашем запросе должен использоваться метод GET, а не POST (используется для создания).
EDIT: Кажется, что вы используете метод SOAP, который нельзя вызвать на стороне клиента, вы должны использовать услугу RESFUL.
Ответ 5
Я нашел этот вопрос, пытаясь решить ту же проблему, так, как я решил, здесь не видно, поэтому я отправляю сообщение кому-то, застрявшему в том же узком месте:
Попробуйте в своем методе использовать EnableSession = true
в вашем атрибуте WebMethod
как
[WebMethod(EnableSession = true)]
public static string MyMethod()
{
return "no me rindo hdp";
}
с этим решена моя ошибка 401. Надеюсь быть полезным.
Ответ 6
В моем случае я добавлял WebMethod к элементу управления формы. Его нужно добавить к самой странице.
Ответ 7
Я столкнулся с той же проблемой и, во-первых, попробовал доступное решение, и оно действительно работает. Однако я понял, что если я создаю новую web-service
и добавлю соответствующий код в папку App_Code
файла web-service
то я не получу никаких ошибок.
Ответ 8
Я знаю, что ваш ответ принят. Это фактически происходит при создании приложения веб-формы и не меняет Authentication
на No Authentication
.
Аутентификация по умолчанию, которую мы видим как Authentication: Individual User Account
Ошибка не придет, если мы перейдем к Authentication: No Authentication
Ответ 9
Мой сайт с помощью ASP.NET форм проверки подлинности, и я работал путем проб и ошибок, что я мог получить только это работать, если я называюсь веб - метод с на .asmx
страницы и с contentType: "application/x-www-form-urlencoded"
и dataType: "xml"
Ответ 10
В моем случае проблема была в URL, который вызывает Ajax.asmx, этот URL был неправильным в соответствии с настройкой веб-сервера, например, "/qa/Handlers/AjaxLib.asmx/"
работал для меня вместо "/Handlers/AjaxLib.asmx/"
(отлично работает на серверах PROD в моей конкретной ситуации):
$.ajax({
url: '/qa/Handlers/AjaxLib.asmx/' + action,
type: "POST",
async: false,
data: data,
contentType: "application/json; charset=utf-8",
success: function () {
Мой AJAX был вызван вне области действия моего каталога виртуальных приложений IIS "qa", следовательно, произошла ошибка авторизации ({"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}).
Ответ 11
Вы должны комментировать только в ~/App_Start/RouteConfig.cs
// settings.AutoRedirectMode = RedirectMode.Permanent;
(Or do this)
settings.AutoRedirectMode = RedirectMode.Off;
Нет ничего общего с аутентификацией в файле Web.config.