Ответы пользователя по тегу ASP.NET
  • Почему некорректно работает параметр маршрутизатора Razor Pages?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Параметры маршрута привязываются к параметрам метода обработчика страницы по имени, т.е. их имена в директиве @page в шаблоне страницы и в списке параметров метода в коде должны совпадать.
    А у вас в @page используется id, а в списке параметров OnGet - pageId. Переименуйте что-нибудь, чтобы имена одинаковые были - и будет вам счастье.
    Ответ написан
  • Зачем нужен Service Locator?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Не легче ли внедрение делать через конструкторы?

    А вы не задумывались над тем, кто и как будет разрешать зависимости для конструкторов?
    В нынешнем ASP.NET Core этим занимются каркасы приложений ("фрейворки", от английского framework). И делают они это как раз через контейнер сервисов (либо напрямую через GetService, либо через ActvatorUtilities).
    Но есть области в ASP.NET Core , которые фремворками не закрываются - наример, в конвейере обработчиков запроса (middleware), там где требуется делегат типа RequestDelegate. И там без прямого обращения к контейнеру сервисов не обойтись.
    Ответ написан
    Комментировать
  • Как ограничить количество запросов на сервер при создании поисковика?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Не то, чтобы ответ, но идея ответа. И если чо непонятно - могу в каментах поуточнять.
    Со стороны тыла (на C#) можно ограничить число параллельных запросов в целом к сервису безо всяких там плагинов, а саморучно сделанным велосипедом: семафором (например, SemaphoreSlim, как самым модным в этом сезоне). Либо сделать его статическим, либо (чтобы веру в IoC свято блюсти и модульные тесты делать) - запихнув в Singleton-сервис с теми же свойствами/методами, что и у семафора используются, и получать этот сервис через конструктор (передавать через DI - в бою, напрямую - в тесте).
    Для семафора(сервиса) устанавливаете максимальное число параллельно выполняемых запросов в качестве начального значения. При входе в обработчик захватываете семафор (Wait/WaitAsync, таймаут - по вкусу), при выходе (лучше - в блоке finally того try, который начинается после захвата семафора) - освобождаете (Release).
    Таймаут выставляете в зависимости от поведения фронта: какие у него у самого таймауты на запрос (в том числе - на повторение) и как он реагирует на задержку ответа и на всякие разные коды статуса HTTP в ответе. В целом, стратегии тут две. Первая - пытаться захватывать семафор с коротким таймаутом и в случае неудачи - возвращать другой код статуса, кроме ОК, чтобы сказать фронту, что он не прав. Вторая - тормозить лишние запросы таймаутами. Кароче, без знания вашего фронтового плагина тут точно не скажешь, а я его знать не знаю и знать не хочу.
    Ответ написан
    Комментировать
  • Как должен быть путь для контроллера?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вы, как у вас написано, передаете название страны и города через путь в URL, то параметры метода Action для URL второго формата должен привязываться к переменной маршрутизации, примерно так:
    [HttpGet("{country}/{city}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String city) 
    {
      //... method code
    }

    [FromRoute] можно и не писать, если параметров запроса (то, что после '?' в URL) нет: привязка по умолчанию выберет следующим источником переменные маршрутизации.
    PS Можно обойтись одним методом действия (Action), если указать что city - параметр необязательный
    [HttpGet("{country}/{city?}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String? city) 
    {
     if(city==null) {
      //... method 1 code 
     }
     else {
      //... method 2 code 
     }
    }
    Ответ написан
    Комментировать
  • Почему прекращается работа BackgroundService?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Работа фонового сервиса у вас прекращается потому что у его метод ExecuteAsync дожидается инициализации статической переменной WebView (она содержит ChromiumWebBrowser, открытый на странице https://web.watsapp.com) а потом ничего не ждет, а просто завершается. А что там у вас происходит с браузером, код вашего фонового сервиса не контролирует.
    PS Я не вижу ваш остальной код, но могу предположить, что вам для работы программы этот фоновый сервис не нужен, т.к. вся работа с экземпляром CefSharp идет через упомянутую статическую переменную.
    Ответ написан
    3 комментария
  • ASP.NET Core 6 Как устранить ошибку при выполнении команды update-database?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    'MultipleActiveResults=True'

    Уберите эти одинарные кавычки.
    Ответ написан
    Комментировать
  • Почему сервер не разрешает [delete] метод (ошибка 405)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Общий ответ - какой-то другой обработчик перехватывает запрос.

    Конкретный ответ зависит от того, как хостится приложение и от остального его кода. Если приложение работает через IIS(хостится на нем или опубликовано через него), то этим обработчиком часто является модуль WebDAV, и его надо отключить. Самый простой вариант, как это сделать - второй ответ этого вопроса: https://stackoverflow.com/questions/55736265/getti..., подробности, если интересно - https://learn.microsoft.com/ru-ru/aspnet/web-api/o...
    Ответ написан
  • Как адаптировать MapPost в метод ControllerBase?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вынесено из комментариев (не туда запостил):

    Если бы я был контроллером API на MVC, я бы тоже так же ответил: "что за фигню вы мне прислали?" (в протоколе HTTP это обозначается кодом статуса 400).
    Контроллер API ждет, что вы ему пришлете, нечто, содержащее значение для параметра message вашего метода действия. Если вы посылаете в формате JSON, то - объект с полем message: тогда он привяжет значение этого поля входному параметру метода действия, который имеет то же имя message, как у вас.
    Потому в запросе POST надо слать объект с этим полем. Например - в уже сериализованном (строковом) формате:
    string content = "TestContent";
    Но можно в качестве content использовать и объект с полем message, например - анонимного типа:
    var content = new { message = "TestContent" };
    - PostAsJsonAsync сумеет превратить это в JSON.

    И да, к контроллеру на Minimal API из вашего первого комментария все это точно так же относится.
    Ответ написан
    Комментировать