Я пишу приложение на ядре 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), ответ сломается.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Во-первых, чтобы отправить запрос 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);
});
}
в рамках того же проекта мы можем определить некоторый файл Services.cs, содержащий нужную вам бизнес-логику. затем вы можете использовать зависимость для внедрения этих сервисов в файл page.razor.cs для вызова методов. вам не нужно отправлять http-запрос....
Спасибо, но я не понимаю, почему браузер пишет «Заголовок Content-Length сетевого ответа превышает тело ответа». Если я отправлю ответ на «/FormResult/GetRes», все будет работать хорошо, и я смогу обработать ответ с сервера в js, но если я изменю ссылку на страницу бритвы (где я работаю), у меня возникнет исключение. Я установил Content-Length, но ничего
Основываясь на моих знаниях, я думаю, что страница Razor отклоняет токен каким-то образом попытайтесь отладить его, а также попробуйте, если вы отправите его в другую конечную точку, это исправит это, но сначала убедитесь, что токен защиты от подделки включен в форму вашей страницы Razor. или ваш запрос на выборку JavaScript, а также убедитесь, что запрос на выборку включает в заголовки токен защиты от подделки, и правильно обработайте запрос POST в методе OnPost страницы Razor и верните ответ JSON.
Итак, ответ на мой вопрос -> используйте
string ResponceJson = JsonConvert.SerializeObject(jsonFormToClient);
return new JsonResult(ResponceJson);
////await Response.WriteAsJsonAsync(ResponceJson); doesn't work
Итак, если я отправлю POST-запросы на другую конечную точку, будет ли это правильно? Например, находясь на странице "/Page/x" я отправлю запрос на конечную точку "Page/y" - будет ли так лучше?