web-dev-qa-db-ja.com

ASPNET CORE Ajax Postが400 Bad Requestを引き起こす

ASP.NET Core上に構築されたASP.NET Zeroに取り組んでいます。ページの1つで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から拡張せずに、コントローラーの基本クラスを使用するだけでも試しました。うまく行かなかった。

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);

Shyjuの回答に基づくajax呼び出しとビューの更新:

  $("#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
5
LMKN

X-XSRF-TOKENを使用してヘッダーを指定してください。

ABP Intercept XMLHttpRequest の場合。

すべてのライブラリはJavaScriptのネイティブAJAXオブジェクト、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
Edward