Ответы пользователя по тегу ASP.NET
  • Батчинг входящих запросов с неблокирующим ожиданием?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Когда-то решал уже похожую проблему. Только чтение батчей из кафки и сохранение в БД. Не знаю какой у тебя стек, но я решил так.

    Создаю Channel и BackgroundWorker, который из этой очереди читает. В эту очередь кладутся объекты по типу InsertContext. В ней хранится аргумент (данные для вставки), поле для результата и Task, который кончится по окончании.

    Работа bw организуется так (в вечном цикле):

    1. Читаем первую запись из Channel (infinite timeout)
    2. Создаем TaskCompletionSource с таймаутом и пока он не кончился читаем записи из Channel (без ожидания)
    3. Собираем все собранные данные
    4. Записываем их в БД
    5. В каждый элемент записываем результат и уведомляем о готовности


    Бесшовно добавить эту функциональность можно с помощью декоратора.

    Единственная проблема в данном случае - ошибки вставки. Если делать это единой транзакцией, то ошибка в 1 инвалидирует все. Но это можно обойти fallback'ом - если произошла ошибка, то вставляем по одному и ошибку возвращаем только тем, у кого они возникли
    Ответ написан
    1 комментарий
  • Почему Model.IsValid = false когда запрос валидный?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Все просто - ты с клиента передаешь JSON объект, а принимаешь на сервере строку.
    Вот и не сходятся типы.
    Либо делай DTO на сервере, либо передавай строку.
    Ответ написан
    Комментировать
  • От чего появляется 405 http code?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Форма отправляется в теле, а ты хочешь ее передать через путь.
    Тег action у form - статический, он не меняется (js тут нет), поэтому он должен быть известен с самого начала.

    Тут 2 решения:
    1. Переделывай все под js (сам все вставляй и прописывай)
    2. Измени способ передачи формы: путь статический (без параметров пути подставляемых), а форма через [FromForm]
    Ответ написан
    Комментировать
  • Как подружить MVC с реляционной базой данных?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Сложные объекты, как раз могут передаваться, просто надо сделать формы другим образом. Скорее всего ты в этот asp-form передаешь всю модель. Предполагаю, что вся модель - это Address.
    Да, из вложенных сложных структур плохо создаются формы. Для решения тебе надо будет форму вручную: все поля и их связь с моделью прописывать самому. Есть шаблонные помощники (Html.EditorFor и другие) - используй их.
    Например, так (внимание, написал по воспоминаниям, может даже не компилироваться)
    @Html.BeginForm() 
    {
          <label>Страна</label>
          @Html.EditorForModel(x => x.Country)
          <label>Город</label>
          @Html.EditorForModel(x => x.City)
    }


    Кроме этого, есть пара других советов:
    1. Создай специальные DTO классы, которые будут потом отображаться в эти объекты БД.
    2. Раз ты делаешь через asp-form, то лушче добавь специальные атрибуты валидации: EmailAddress, Range и т.д.

    P.S. в 1 пункте проблема глубже, чем простой маппинг. Если делать такой подход, который показан:
    - Изменения схемы БД потребуют изменения UI
    - Клиент может передать данные, о которых он знать не должен (например, добавишь новое поле куда-нибудь и оно случайно обновится)
    Ответ написан
    2 комментария
  • Зачем нужен Service Locator?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Случаев использования много. В некоторых без него не обойтись.
    Например:
    - Зависимость необязательна
    - Есть множество реализаций, а не 1
    - Отложенное создание

    Если не хочешь использовать - не используй
    Ответ написан
    1 комментарий
  • Стотит ли менять asp.net mvc на asp.net web api + nextjs?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    нормально себя чувствует.

    Работает и не трогай
    Ответ написан
    3 комментария
  • В чём отличие между middleware и фильтрами в .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Middleware - это часть ASP.NET Core. Они занимаются обработкой HTTP запроса, могут его изменять/дополнять. Например, производить авторизацию или, если запрос пришел от прокси, то разворачивать отображать HTTP заголовки
    Фильтры - это часть MVC, фреймворка внутри ASP.NET Core. Т.е. они часть контроллеров и предназначаются только для них, но могут работать и как Middleware (HttpContext поле доступно). Дополнительно, у них есть иерархия вызовов, в зависимости от типа фильтра, а middleware вызываются каждая и в зависимости от порядка их регистрации
    Ответ написан
    2 комментария
  • Как связать grpc message з MediatR?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Почему не сделать отдельный IRequest, у которого единственное поле - этот массив байтов модели?
    Либо при получении этого массива делай его парсинг и создавай отдельный, готовый класс модели IRequest
    Ответ написан
  • Почему контейнер успешно создается локально, но не создаётся из регистра?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В докерфайле не вижу слоя с рантаймом - только sdk.
    Посмотри шаблон тут - https://learn.microsoft.com/ru-ru/dotnet/core/dock...
    Ответ написан
    1 комментарий
  • Как управлять локализацией дат?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Даты в БД хранишь в формате UTC. Можно даже без таймзон. Главное, чтобы все представляли единый формат/точку отчета.

    На клиенты отправляешь эту дату. JS может создавать Date используя ISO формат - клиент эту дату парсит и используя свою временную зону парсит.

    В общем, смысл следующий:
    - В БД даты хранятся относительно UTC
    - На и с клиента даты отправляются в UTC формате - представление даты с учетом таймзоны будет на стороне пользователя/UI, а коде бизнес-логики работа ведется с UTC

    Клиент лучше знает, какая у него таймзона и локаль
    Ответ написан
    2 комментария
  • Зачем использовать ViewData если есть свойство в PageModel?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    ViewData - это инструмент из ASP.NET Core MVC - старых MVC проектов. Он нужен, чтобы обойти строгую типизацию и передавать опциональные параметры.
    PageModel - это уже новый фреймворк, который построен поверх MVC и сделан на упор в одностраничник, т.е. мы сразу можем что на странице должно быть отображено. Поэтому ViewData уже не особо нужен.

    В итоге, использовать ViewData стоит если есть какие-то опциональные, transient данные, которые можно использовать. В примерах это заголовок страницы.
    Ответ написан
    Комментировать
  • Как реализовать функцию статистики просмотра страницы за некий период?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Тут подходит какая-нибудь аналитическая СУБД. Например, ClickHouse практически для этого и создавался (Click Stream + Ware House).
    Хранить можно следующим образом:
    1. Есть общая таблица по посещениям/визитами с примерно такой структурой [page_id, visit_date] (больше и не надо)
    2. Для хранения статистики создаешь материализованные представления для дня/недели/года

    У них есть тестовые данные для плейграунда сбора аналитики по посещениям/хитам - https://clickhouse-docs.vercel.app/docs/en/getting...
    Ответ написан
    3 комментария
  • Как передать данные из одного представления в другое?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Url.Action принимает аргумент object? values (последний). В него нужно передать параметры для обработчика MVC контроллера. Передавать в виде анонимного объекта.
    Для твоего случая это будет в виде:
    @foreach (var item in Model)
        {
            <tr onclick="location.href='@Url.Action("ViewOrder", "Home", new { id = item.Id })'">
                <td>@item.Id</td>
                <td>@item.CitySender</td>
                <td>@item.AdressSender</td>
                <td>@item.CityRecipient</td>
                <td>@item.AdressRecipient</td>
                <td>@item.Weight</td>
                <td>@item.Date</td>
            </tr>
        }

    Этот item.Id будет передаваться параметром в обработчик контроллера через параметр, который называется id.
    Например, в этотpublic IActionResult ViewOrder(int id)
    Ответ написан
    1 комментарий
  • Почему gRPC подменяет исключения?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    А откуда другой сервис знает, какие КЛАССЫ/ОБЪЕКТЫ есть в другом сервисе?
    Если нужно кидать такое-же исключение на сервисе клиенте, то нужно это исключение там и создать.

    А вообще, для своих типов исключений необходимо использовать GRPC_STATUS_UNKNOWN. В документации так и написано:
    Server threw an exception (or did something other than returning a status code to terminate the RPC)


    Решение только одно - в каждом сервисе писать свои обработчики таких исключений и свои классы исключений
    Ответ написан
    2 комментария
  • Влияет ли геолокация на парсинг float?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Влияет скорее не геолокация, а локаль пользователя. В данном случае это влияет на разделитель.
    Вот пример:
    var number = 1.123;
    
    var russian = new CultureInfo("ru-RU"); // Россия
    var american = new CultureInfo("en-US"); // США
    Console.WriteLine($"Россия: {number.ToString(russian)}");
    // Вывод: 1,123
    Console.WriteLine($"Америка: {number.ToString(american)}");
    // Вывод: 1.123


    UPD: TryParse и Parse методы принимают в себя IFormatProvider, который имеет информацию о локали (CultureInfo)
    if (double.TryParse("123.123", russian, out var result))
    {
        Console.WriteLine($"Русский: {result}");
    }
    else if (double.TryParse("123.123", american, out result))
    {
        Console.WriteLine($"Американский: {result}");
    }
    else
    {
        Console.WriteLine($"Ни один не сработал");
    }
    // Выведет: Американский: 123,123
    Ответ написан
  • Как ограничить количество запросов на сервер при создании поисковика?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Лучше будет выставлять больший таймаут перед запросом. Т.е. если сейчас запрос делается спустя 0,5 сек после ввода, то сделай спустя 1 сек.

    Либо, чтобы запрос выполнялся, когда ввода не было X секунд
    Ответ написан
  • Как вывести ссылку в переменную asp dot net core?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Метод расширения GetDisplayUrl() у Request объекта (если это MVC)

    [ApiController]
    [Route("[controller]")]
    public class SampleController : ControllerBase
    {
        [HttpGet("")]
        public IActionResult GetPath()
        {
            return Ok( Request.GetDisplayUrl() );
        }
    }
    Ответ написан
    Комментировать
  • Какие бывают режимы работы сборщика мусора в .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    как их можно и нужно применить на практике?

    Применять их никак не нужно. Платформа сама решит в каком режиме ей нужно работать.
    Такая сейчас идет политика разработки: "просто пиши код, а остальное на нас"
    Ответ написан
    3 комментария
  • Почему прекращается работа BackgroundService?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего проблема в самом WhatsApp. Он сам выходит из сессии, если активностей не было.
    Но как я понял, логаут происходит после 30 минут, а не 1 часа без активности
    https://www.roadlesstraveledstore.com/can-i-automa...
    Ответ написан
    1 комментарий
  • Как универсально сформировать Response?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    "Какой вид response лучше всего отправлять?"


    Какой удобнее. Перед тем как код писать надо хотя бы подумать, в каком виде ответ ожидается/легче использовать.
    OpenAPI для согласования API тебе в помощь

    С другой стороны, если я отправляю DTO на фронт, то фронтер должен сопоставить свой класс с моим, наверное, это тоже проблематично при большом количестве полей


    Есть готовые фреймворки для такого. Например, GraphQL - можно указать что конкретно тебе нужно.
    Есть и другие, как OData. Либо можешь свой написать, чтобы клиент сам указывал поля, какие нужны.

    Стоит ли вообще приводить response к массиву?


    Нигде не видел подобного поведения. Если бы был пример ответа в таком формате, то мог бы сказать.
    Если имеется ввиду вместо объекта - массив значений его полей, то это плохая затея.
    Ответ написан
    Комментировать