Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
1

Не проходит запрос на API контроллер на IIS - ошибка 400, на IISExpress запросы проходят

26.07.2021, 07:08. Показов 5669. Ответов 12

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Проблема с прохождением запросов из вне на api-контроллеры. Очень нужна помощь!

Проект ASP NET CORE MVC 3. Сервер IIS10.

Представления изначально отображаются с помощью контроллеров mvc. Везде где задействованы mvc контроллеры - все работает и на IISExpress и на IIS после деплоя. Часть функционала у меня работает через api-контроллеры, функции JS у меня отправляют запрос на api-контроллеры, и вот API контроллеры после публикации не работают, если запрос идет из вне - выдает ошибку:
Failed to load resource: the server responded with a status of 400 (Bad Request)
{type: "https://tools.ietf.org/html/rfc7231#section-6.5.1", title: "Bad Request", status: 400,…}
status: 400
title: "Bad Request"
traceId: "|1763bd64-457e0bbd74a0ee83."
type: "https://tools.ietf.org/html/rfc7231#section-6.5.1"
В заголовках запроса и ответа:
General
Request URL: http://195.226.ххх.хх/CollectV... rchStreets
Request Method: POST
Status Code: 400 Bad Request
Remote Address: 195.226.ххх.хх:80
Referrer Policy: strict-origin-when-cross-origin

Content-Length: 135
Content-Type: application/problem+json; charset=utf-8
Date: Sun, 25 Jul 2021 11:42:34 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET

Response
Content-Length: 135
Content-Type: application/problem+json; charset=utf-8
Date: Sun, 25 Jul 2021 11:42:34 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET

Request
Accept: application/json
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 43
Content-Type: application/json
Host: 195.226.ххх.хх
Origin: http://195.226.ххх.хх
Pragma: no-cache
Referer: http://195.226.ххх.хх/collectvoters/Friends/Create
RequestVerificationToken: CfDJ8E_6DbN7jdpPgMFyLYN6J0P0VzaS58Os_XphjMs6pjfQCxYf7ONglfuOTkhJe0fAG-BL6yle7KQOFJ46hExJe61mPCI3u0Ad9VLa1dVwE4p4A55xXzZ10llou70siWF3WBoS5WOyL9ZnXnqfb0 QM_OkTbgsFOtGdNp-MWCCPmgAerO9sa7Nj7QBO2OdjlKONdg
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36
X-Requested-With: XMLHttpRequest

{IdCity: 10, Name: "Сакмарский"}
IdCity: 10
Name: "Сакмарский"
API контроллер обрабатывающий запрос:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Route("api/[controller]")]
    [ApiController]
    [Produces("application/json")]
    public class APIController : ControllerBase
    {
        private readonly VoterCollectorContext _context;
 
        public APIController(VoterCollectorContext context)
        {
            _context = context;
        }     
 
        [HttpPost("searchStreets")]
        [ValidateAntiForgeryToken]
        public IActionResult SearchStreets(CityDTO citySelected)
        {
            List<Street> streets =  _context.Street.Where(s => s.CityId == citySelected.CityId).ToList<Street>();
            
            if (streets.Any())
            {
                //...
                return Ok(streetsDTO);                
            }
            return NoContent();
        }
}
Функция JS осуществляющая ajax запрос:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Обновление списка улиц после выбора города
$(function () {
    $("#CityId").change(function () {
        var formData = { 'CityId': Number.parseInt($('#CityId').val()), 'Name': $('#CityId>option:selected').text() };
        $.ajax({
           // url: "http://localhost:18246/api/API/searchStreets",
            url: "/api/API/searchStreets",
            headers:
            {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'RequestVerificationToken': $('#RequestVerificationToken').val()
            },
            type: 'POST',
            dataType: "json",
            data: JSON.stringify(formData),
            success: function (data) {
 
                dataFilling(data, 'idStreet', 'name', '#StreetId', '<option/>');
            },
            error: function (result, status, er) {
                alert("error: " + result + " status: " + status + " er:" + er);
            }
        });
 
    });    
});
С самого компа, где стоит IIS запросы уходили нормально (потом запустил на нём IIS Express и полетела авторизация).

Изначально он ещё выдавал ошибку:
POST http://localhost/api/API/searchStreets 404 (Not Found) jquery.min.js:2
Её удалось решить, для запросов на api-контроллеры в url необходимо ещё было добавлять адрес самого приложения, т.е. указывать не /api/API/searchStreets, как на IISExpress, а /CollectVoters/api/API/searchStreets.

По советам в интернете пробовал чистить куки, отключать брендмауер, отключать антивирусник - не помогло.

Подскажите пожалуйста, где может быть ошибка? Что нужно посмотреть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2021, 07:08
Ответы с готовыми решениями:

Net core и Яндекс Directory API - не проходят PATCH запросы
Доброго времени суток! Возникли проблемы в первую очередь с Яндекс API, но так как подходящей...

Vk api ошибка "(400) Недопустимый запрос"
Добрый день. Сделал отправку сообщения в группу, но при отправке большого текста выскакивает ошибка...

GET-запрос Twitter API: не проходит авторизация
Ребят,всем добрый день. В общем мне надо ,используя Twitter API послать запрос - (это ссылка на...

Ajax запрос на контроллер web api core
Добрый день ! как сделать ajax запрос на контроллер asp net core web api ? есть проект web api в...

12
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
26.07.2021, 09:54 2
Volodya_,
.. это может быть связано с настройками CORS на сервере ... хотя 400 Bad request прямо к CORS не относится, но POST запрос из JS сначала отправляет запрос типа OPTION, а поскольку CORS его блокирует, ну и т.д. ....
1
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
26.07.2021, 12:42  [ТС] 3
Цитата Сообщение от carrotik Посмотреть сообщение
.. это может быть связано с настройками CORS на сервере ... хотя 400 Bad request прямо к CORS не относится, но POST запрос из JS сначала отправляет запрос типа OPTION, а поскольку CORS его блокирует, ну и т.д. ....
Что нужно посмотреть, чтобы проверить? Что можно сделать?
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
26.07.2021, 15:13 4
Цитата Сообщение от Volodya_ Посмотреть сообщение
Что нужно посмотреть, чтобы проверить? Что можно сделать?
... поскольку сам я IIS давно не пользуюсь, то вы сможете по запросу IIS CORS сами нагуглить много чего, но базово:
Enable Cross-Origin Requests (CORS) in ASP.NET Core
IIS CORS module Configuration Reference
... и посмотрите запрос в Инструментах разработчика в браузере, а еще лучше - в Fiddler-e, отправляет ли ваш JS запрос OPTION перед непосредственно POST (так по идее должно быть) ...
1
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
26.07.2021, 15:40  [ТС] 5
Цитата Сообщение от carrotik Посмотреть сообщение
... и посмотрите запрос в Инструментах разработчика в браузере, а еще лучше - в Fiddler-e, отправляет ли ваш JS запрос OPTION перед непосредственно POST (так по идее должно быть) ...
посмотрел, нет не отправляет, только сам запрос
0
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
27.07.2021, 12:09  [ТС] 6
Цитата Сообщение от carrotik Посмотреть сообщение
.. это может быть связано с настройками CORS на сервере ... хотя 400 Bad request прямо к CORS не относится, но POST запрос из JS сначала отправляет запрос типа OPTION, а поскольку CORS его блокирует, ну и т.д. ....
Проверил в Startip.cs в Configure, там CORS не включен, получается у меня в сервисе его нет и блокировать он не может.

Прочитал ещё, что вроде OPTIONS-запрос при простых запросах не обязателен, но в ответе от сервера, если работает CORS, другого домена должен быть заголовок Access-Control-Allow-Origin, который должен содержать разрешённый источник, по идее тот, что в заголовке Origin (в моем случае http://195.226.ххх.хх), но в заголовке Origin у меня домен моего сервера, и уже получается, что это не междоменный запрос и источник==сервер. Вот тут я уже запутался.

Ещё момент, что в какие-то первые запуски приложения этой ошибки (400) не было, а потом после ряда изменений и новых запусков появилась. Но изменений связанных с маршрутизацией никаких не вносил, всё вроде было по алгоритмам
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
27.07.2021, 14:14 7
Volodya_, а устанавливали .NET 5 Hosting Bundle?
0
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
27.07.2021, 14:54  [ТС] 8
Цитата Сообщение от Рядовой Посмотреть сообщение
а устанавливали .NET 5 Hosting Bundle?
Нет, устанавливал dotnet-hosting-3.1.13-win
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
27.07.2021, 15:00 9
Volodya_, попробуйте разместить пустой сайт, будет работать или нет.
Просто непонятно проблема в вашем коде или iis
0
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
27.07.2021, 15:34  [ТС] 10
Цитата Сообщение от Рядовой Посмотреть сообщение
попробуйте разместить пустой сайт, будет работать или нет.
Просто непонятно проблема в вашем коде или iis
У меня и не пустой сайт работает
Везде где задействованы mvc контроллеры - все работает и на IISExpress и на IIS после деплоя.
. Проблема только с API-контроллерами, только по ним выдает 400 ошибку и только при запросе из вне
0
19 / 17 / 3
Регистрация: 11.05.2018
Сообщений: 165
02.08.2021, 19:01 11
Метод не может десереализовать ваш объект
переделайте так, и проверьте свойства класса
C#
1
public IActionResult SearchStreets([FromBody] CityDTO citySelected)
Добавлено через 2 минуты
Javascript
1
2
var formData = { 'cityId': Number.parseInt($('#CityId').val()), 'name': $('#CityId>option:selected').text() };
debugger;
0
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
02.08.2021, 20:54  [ТС] 12
Цитата Сообщение от anuartemirbolat Посмотреть сообщение
Метод не может десереализовать ваш объект
Не, там была проблема в анотации [ValidateAntiForgeryToken]. API контроллеры не работают с [ValidateAntiForgeryToken] как mvc контроллеры.
0
Эксперт .NET
1696 / 1325 / 316
Регистрация: 15.06.2012
Сообщений: 5,045
Записей в блоге: 3
03.08.2021, 06:00 13
Цитата Сообщение от Volodya_ Посмотреть сообщение
Её удалось решить, для запросов на api-контроллеры в url необходимо ещё было добавлять адрес самого приложения, т.е. указывать не /api/API/searchStreets, как на IISExpress, а /CollectVoters/api/API/searchStreets.
Смахивает что вы развернули на IIS сайт как под-приложение Default.
0
03.08.2021, 06:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2021, 06:00
Помогаю со студенческими работами здесь

Как написать POST запрос на стандартный контроллер API
Доброго всем времени, с прошедшими праздниками! Будьте добры, пожалуйста подскажите, как отправить...

В Spring-Security проходит ГЕТ-запрос, но не проходит ПОСТ-запрос
Здравствуйте! Тестирую с помощью http-клиента Intellije IDEA RestController. Для обхода...

На англоязычном IIS 5 не проходят русские тексты из базы.
На англоязычном IIS 5 не проходят русские тексты из базы. Как заставить файл ASP понимать русскую...

Зачем нужен контроллер API если есть контроллер MVC?
Вопрос с собеседования. И так, понятно что API контролер ограничен относительно контроллера MVC. Не...

Post запросы не проходят
Есть форма: &lt;div class=&quot;container&quot;&gt; &lt;div class=&quot;row&quot;&gt; &lt;div class=&quot;col-sm-6...

Не проходят POST запросы
Здравствуйте, пробую сделать HTTP сервис из под 1С. Использую Apache и платформу 8.3.10.2561. GET...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru