Asp net core вызывает ошибку Fetch: TypeError

Я пишу приложение на ядре asp net с помощью Razor Pages. Я долго думал о том, как обрабатывать POST-запросы (OnPost в razor-страницах), прочитав эту страницу "https://learn.microsoft.com/ru-ru/aspnet/core/security/anti-request-forgery?view=aspnetcore" -8.0", я добавляю безопасный токен для js и начинаю обрабатывать POST-запросы, но теперь ответ от сервера вызывает ошибку Fetch: TypeError. Кажется, я упускаю что-то важное, но не могу понять что. Если я начну обрабатывать запрос с помощью «app.Map», все будет работать без проблем.

UDP1: запись FireFox — заголовок Content-Length сетевого ответа превышает тело ответа. Как я могу исправить это в своем коде?

UDP2: Интересно, что заголовки одинаковы и не содержат Content-Length, если я использую app.Map, это работает, но если я использую страницу бритвы - исключение.

Заголовки: { "content-type" - "application/json; charset=utf-8", date - "пон, 8 июля 2024 г., 04:22:46 GMT", сервер - "Kestrel", "x-firefox-spdy" - " h2" }

Мой рабочий код:

app.Map("/FormResult/GetRes", HandleMapFormRes);

static void HandleMapFormRes(IApplicationBuilder app)
{
    string text = string.Empty;
    app.Run(async context =>
    {

        if (context.Request.Method == "POST")
        {
            try
            {
             /* .......
              .......
              .......
              ....... */

                JsonFormToClient jsonFormToClient = new JsonFormToClient();
                jsonFormToClient.Blockinfo = results;
                jsonFormToClient.CountOfBlocks = c;
                string ResponceJson = JsonConvert.SerializeObject(jsonFormToClient);

                await context.Response.WriteAsJsonAsync(ResponceJson);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

    });
}
function drawChart(pathToPage,token) {
    var htmlContent = pathToPage;
    var formData = new FormData();
    formData.append('htmlContent', htmlContent);
    fetch(pathToPage, {
        method: 'POST',
        body: formData,
        headers: {
            "X-XSRF-TOKEN": token
        },
    })
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            var a = response.json();
            return a;
        })
        .then(jsonData => {
            a = JSON.parse(jsonData);

            for (let i = 0; i < a.CountOfBlocks; i++) {
                AddNewBlock(a.Blockinfo[i].Id_in_html);
                drawnow(a.Blockinfo[i]);
            }
        })
        .catch(error => {
            console.error('Error fetching data:', error);
        });
}

Если я обработаю это с помощью Razor Page (OnPost), ответ сломается.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, чтобы отправить запрос POST на тот же URL-адрес (pathToPage), который вы пытаетесь получить, используйте функцию get. Публикация на той же странице, которую вы пытаетесь получить, встречается нечасто. Обычно конечная точка API получает запрос POST.

и, во-вторых, повторное использование и повторное объявление переменной может сбить с толку и привести к ошибкам.

вы можете попробовать это:

function drawChart(pathToPage, token) {

  var htmlContent = document.documentElement.innerHTML; 
  var formData = new FormData();
  formData.append('htmlContent', htmlContent);

  fetch(pathToPage, {
      method: 'POST',
      body: formData,
      headers: {
          "X-XSRF-TOKEN": token
      },
  })
  .then(response => {
      if (!response.ok) {
          throw new Error('Network response was not ok');
      }
      return response.json(); 
  })
  .then(jsonData => {
      for (let i = 0; i < jsonData.CountOfBlocks; i++) {
          AddNewBlock(jsonData.Blockinfo[i].Id_in_html);
          drawnow(jsonData.Blockinfo[i]);
      }
  })
  .catch(error => {
      console.error('Error fetching data:', error);
  });
} 

Итак, если я отправлю POST-запросы на другую конечную точку, будет ли это правильно? Например, находясь на странице "/Page/x" я отправлю запрос на конечную точку "Page/y" - будет ли так лучше?

Vasiliskb 08.07.2024 04:58

в рамках того же проекта мы можем определить некоторый файл Services.cs, содержащий нужную вам бизнес-логику. затем вы можете использовать зависимость для внедрения этих сервисов в файл page.razor.cs для вызова методов. вам не нужно отправлять http-запрос....

Tiny Wang 08.07.2024 05:31

Спасибо, но я не понимаю, почему браузер пишет «Заголовок Content-Length сетевого ответа превышает тело ответа». Если я отправлю ответ на «/FormResult/GetRes», все будет работать хорошо, и я смогу обработать ответ с сервера в js, но если я изменю ссылку на страницу бритвы (где я работаю), у меня возникнет исключение. Я установил Content-Length, но ничего

Vasiliskb 08.07.2024 06:01

Основываясь на моих знаниях, я думаю, что страница Razor отклоняет токен каким-то образом попытайтесь отладить его, а также попробуйте, если вы отправите его в другую конечную точку, это исправит это, но сначала убедитесь, что токен защиты от подделки включен в форму вашей страницы Razor. или ваш запрос на выборку JavaScript, а также убедитесь, что запрос на выборку включает в заголовки токен защиты от подделки, и правильно обработайте запрос POST в методе OnPost страницы Razor и верните ответ JSON.

Bahez 08.07.2024 11:55

Итак, ответ на мой вопрос -> используйте

string ResponceJson = JsonConvert.SerializeObject(jsonFormToClient);
return new JsonResult(ResponceJson);

////await Response.WriteAsJsonAsync(ResponceJson); doesn't work

Другие вопросы по теме