ASPNET CORE Ajax Post приводит к 400 неправильных запросов - PullRequest
0 голосов
/ 07 января 2019

Я работаю над ASP.NET Zero, который построен на ASP.NET Core. Когда я использовал элемент управления загрузкой KendoUI на одной из моих страниц, я получил ошибку неверного запроса. После долгих исследований я понял, что запрос HTTP POST Ajax не выполняется с ошибкой 400 неверных запросов. В приведенных ниже примерах кода есть несколько комментариев для других тестируемых сценариев. Ни один из существующих постов в стеке над потоком не решил мою проблему. Ниже приведен мой вызов ajax:

 $.ajax({
            url: "/test/TestCall",
            type: 'Post',
           /* data: JSON.stringify({ "Param1": "test" }),
            dataType:"json",
            processData: false,  */// tell jQuery not to process the data
            contentType: "application/json",  // tell jQuery not to set contentType
            success: function (result) {
                var res = result;
            },
            error: function (jqXHR) {
                var z = 3;
            },
            complete: function (jqXHR, status) {
                var x = 10;
            }
        });

Мой код контроллера: я также пытался не выходить за пределы MyTestProjectControllerBase и просто использовать базовый класс Controller. Это не сработало.

public class TestController : MyTestProjectControllerBase
{
    public IActionResult Index()
    {
        return View();
    }

   [HttpPost]
    public ActionResult TestCall()
    {
        //return Content("Name is:" );
        return new ContentResult() { Content = "test" };
    }
}

Чего мне не хватает? Я пытался использовать почтальон, и я вижу эту дополнительную информацию «Запрос не может быть выполнен из-за неправильного синтаксиса»

не смог разобраться, потратив 8 часов на эту проблему. Не уверен, что проблема связана с ядром Asp.net или нулем asp.net. Любые указатели будут с благодарностью.

Обновление после проверки комментариев по shyju: Файл Startup.cs содержит следующий код, который включает AntiForgeryTokenAttribute

 services.AddMvc(options =>
        {
            options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Обновление вызова и просмотра ajax на основе ответа shyju:

  $("#backBtn").on("click", function (e) {
        var t = $("input[name='__RequestVerificationToken']").val();
        $.ajax({
            url: "/test/TestCall",
            type: 'Post',
           /* data: JSON.stringify({ "Param1": "test" }),
            dataType:"json",
            processData: false,  */
            contentType: "application/json",  
            headers: {
                "RequestVerificationToken": t
            },
            success: function (result) {
                var res = result;
            },
            error: function (jqXHR) {
                var z = 3;
            },
            complete: function (jqXHR, status) {
                var x = 10;
            }
        });
    });

Мой взгляд теперь выглядит так: удален остаток HTML

<div id="container">
    @Html.AntiForgeryToken()
    <div class="k-edit-field label">Vendor Name</div>
</div

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Попробуйте указать заголовок с X-XSRF-TOKEN.

Для ABP Intercept XMLHttpRequest .

Поскольку все библиотеки используют собственный объект AJAX JavaScript, XMLHttpRequest, вы можете определить простой перехватчик для добавления токена в заголовок:

(function (send) {
    XMLHttpRequest.prototype.send = function (data) {
        this.setRequestHeader(abp.security.antiForgery.tokenHeaderName, abp.security.antiForgery.getToken());
        return send.call(this, data);
    };
})(XMLHttpRequest.prototype.send);

Для abp.security.antiForgery.tokenHeaderName его значение по умолчанию равно X-XSRF-TOKEN

0 голосов
/ 07 января 2019

Похоже, у вас есть фильтр AutoValidateAntiforgeryTokenAttribute, применяемый глобально. Это означает, что когда вызывается метод действия HTTP Post (обычный или ajax), платформа проверит отправленные данные запроса и, если не найдет действительный токен защиты от подделки (заголовок RequestVerificationToken), это будет считаться неправильным запросом и ответ 400 будет отправлен обратно.

Чтобы решить эту проблему, вы можете явно прочитать значение __RequestVerificationToken скрытого ввода (сгенерированное помощником тега формы) и отправить его в заголовки вашего запроса ajax.

var t = $("input[name='__RequestVerificationToken']").val();

$.ajax({
    url: "/test/TestCall",
    type: 'Post',
    headers:
    {
        "RequestVerificationToken": t
    },
    success: function (result) {
        alert("Success");
        var res = result;
    },
    error: function (jqXHR) {
        var z = 3;
    },
    complete: function (jqXHR, status) {
        var x = 10;
    }
});

Вы можете сделать код более надежным, внедрив реализацию IAntiforgery в представление / страницу и используя метод GetAndStoreTokens.

Добавьте это к вашему мнению

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
    return Xsrf.GetAndStoreTokens(Context).RequestToken;
}
}

и вызовите эту функцию GetAntiXsrfRequestToken, чтобы получить значение в вашем javascript (который находится внутри файла представления)

headers:
{
    "RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...