Задать вопрос
  • Как запустить сайт на С# в Ubuntu 20.04?

    https://learn.microsoft.com/ru-ru/aspnet/core/host...

    Как именно собирался он? На убунте ты сможешь запустить приложение только если используется .NET 5+ или Core, но не .NET Framework.

    Для этого тебе нужен соответствующий рантайм:
    https://learn.microsoft.com/en-us/dotnet/core/inst...
    Ответ написан
    3 комментария
  • Где можно посмотреть реализацию готовых и профессиональных WebAPI в связке с клиентом?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Microsoft создал референсный микросервисный проект - eShopOnContainers. Там есть основные паттерны проектирования, клиенты различные (ajax, mvc).

    А вообще, это только часть общего репозитория с проектами под различные кейсы - dotnet-architecture

    Если есть время, то можно и книгу прочитать по этой архитектуре
    Ответ написан
    Комментировать
  • .Net 6 где хранить настройки?

    Кажется, тут сразу три независимые вещи, которые часто хранят раздельно:

    1. Собственно настройки
    Их удобнее всего хранить в appsettings.json, который можно спокойно закоммитить в репозиторий.
    В коде можно получить к ним доступ через IConfiguration или IOptions

    2. Секреты (пароли, токены, итд)

    Строку подключения в общем то решил захардкодить.

    Остается имя админа и пароль + почта.

    Их лучше в репозитории не хранить.
    Благо IConfiguration можно наслаивать и прокидывать секреты через переменные окружения, например, или использовать какой-нибудь Vault или keyring.
    Уже упомянутый диспетчер секретов можно использовать только для разработки, но не для прода.

    3. Фича-флаги.

    Дальше динамическая смена настроек как то:
    OAUTH авторизация, которую выключать и включать можно.

    Их часто хранят в базе данных, да. Есть также несколько уже готовых решению для удобного управления фича флагами.
    Гуглить feature flags.
    https://learn.microsoft.com/en-us/azure/azure-app-...

    4. Если есть конфиги, которые нужно менять на лету, то тут нужно уже смотреть, как именно нужно отрабатывать изменение конфигов.
    Например мы храним такие конфиги в etcd и явно подписываемся на изменения. В случае изменений - делаем какие-то действия.

    В дотнете для работы с такими конфигами есть интерфейс IOptionsMonitor
    Ответ написан
    1 комментарий
  • Как бороться с race condition при обращении к REST API во Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Просто не давть пользователю повторно тыкать там, где это вызовет повторный запрос, пока идёт загрузка текущего?

    Но если хочется быть ленивым - можно просто обернуть запросы в leading debounce-promise.

    Все эти thunk и saga - полная ересь, порождённая богомерзким redux.
    Ответ написан
  • Какую LMS выбрать Фрилансеру и Руководителю для обучения сотрудников в 2023?

    @systembro
    Ну замену Moodle сложновато будет найти. Есть, конечно, iSpring Learn LMS, но вы будто ищете что гибче, выбор невелик: Chamilo, Canvas lms, ILIAS...
    Ответ написан
    Комментировать
  • Почему не проходит Authorize?

    @OwDafuq
    Токены отправляются с клиента в заголовке в формате "Bearer eyJhbGc......"

    Неправильно передаете токен в заголовке, так генерирует Swagger:
    65003f7bbe115283639973.png
    Ответ написан
    2 комментария
  • Какой стек необходим для изучения GraphQL и Apollo?

    @holllop
    Ну смотри. Если ты собираешься изучить работу с GraphQL и Apollo, то нужны хотя бы базовые знания по Node.js, так как Apollo в значительной степени связан с экосистемой Node.js и использует его для создания серверов GraphQL.
    Теперь к основным темам которые желательно знать(список не полный тут только те, что я вспомнил):
    1. Express.js: Express является популярным фреймворком для Node.js, и его знание будет полезным при создании сервера GraphQL с помощью Apollo. Рекомендуется изучить основы Express.js, такие как маршрутизация, обработка запросов и ответов, и middleware.
    2. Работа с базами данных: Apollo и GraphQL часто используются для запросов и манипуляций данных в базах данных. Поэтому полезно знать основы работы с базами данных в Node.js, такие как использование ORM (например, Sequelize или Mongoose), выполнение запросов SQL или MongoDB и работу с моделями данных.
    3. Асинхронное программирование: В GraphQL и Apollo запросы часто выполняются асинхронно. Поэтому знание принципов асинхронного программирования в JavaScript, таких как использование промисов, асинхронных функций и async/await, будет полезным.
    4. REST API: Хорошее понимание понятий и принципов работы с REST API также может быть полезным при изучении GraphQL, так как GraphQL может быть использован как альтернатива REST API. Рекомендуется изучить основы RESTful API и понимание различий между REST и GraphQL.
    Это те что мне первые приходят на ум возможно дополню список
    Ответ написан
    3 комментария
  • Как в контроллеры привязывается CancellationToken?

    Если совсем боишься - можешь брать CancellationToken не из аргументов, а из контекста (HttpContext.RequestAborted)

    А подсовывает его тебе рантайм через процесс под названием model binding:
    https://learn.microsoft.com/en-us/aspnet/core/mvc/...
    Биндинг происходит чисто по совпадению типа и имя аргумента не влияет на него.
    Ответ написан
    5 комментариев
  • Как при сборки мусора и перемещении объекта, сохраняется корректность ссылок?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Управление памятью в .NET для профессионалов

    Как работает сборка мусора.
    В .NET используется 2 фазная сборка мусора: Mark & Sweep (Пометить и Убрать).

    Mark

    На этом этапе обходится весь граф объектов. И выявляются все недостижимые.

    Каким образом достижимость объектов определяется?

    Достижимые это:
    - Аллоцированные на стеке
    - В статических полях
    - Достижимые из достижимых (см. выше)

    Все объекты, которые не удалось достичь (в граф не попали) - являются недостижимыми.

    Но на стеке лежат числа. могут быть как числами, так и адресами, как и числами?

    JIT копилятор достаточно умный, чтобы сгенерить код, который будет знать, что за объект/ссылка лежит на стеке. Так и получаются знания об объектах.

    Sweep

    Тогда итог, что языки с сборщиком мусора, под в 2 раза медленнее должны быть.(помимо сборки)

    Вот тут интереснее. Есть несколько хаков как достигается большая производительность.
    1. Линеризованное пространство памяти.
    Адреса 0, 1 и 2 поколения расположены не абы где, а последовательно, друг за другом. Т.е. если нужно сократить пространство 0 поколения, то это означает простое передвигание указателя влево.

    2. Переход в след. поколение происходит не всегда
    Из 0 в 1 - переход быстрый, но из 1 в 2 - не всегда.
    На этом этапе тоже может не затрачиваться много времени.

    3. Ссылки из недостижимых объектов не обновляются - эти объекты и так нигде не участвуют
    Обновление ссылок, к сожалению, - это ручное изменение и копирование. Ничего не поделаешь.

    Теперь где-то, сборщик мусора, начинает переносить arr в другое место.

    Ты слишком большой массив выделил, он аллоцируется в LOH. Оттуда не вытащишь.

    Я много о чем не упомянул. Например, очередь финализации, таблица дескрипторов (Handle), сегментирование памяти и т.д. но ответы на основные вопросы дал
    Ответ написан
    2 комментария
  • Возможно ли авторизоваться если злоумышенник получит чужие куки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С точки зрения современного инфо-беза логин + пароль - уже не танцуют.
    Сейчас - основной упор на безопасность - это многофакторка. И время сессии
    желательно как можно меньше. Например 15 минут. В кабинетах банков так уже делают.

    Если злоумышленник у вас угнал куки то у него есть очень мало времени чтобы ими
    воспользоваться иначе надо будет доставать как-то ваш телефон или RSA-брелок.

    Кроме того сами методы многофакторки рандомно меняются. Банк для авторизации
    входа может позвонить голосом. Чтоб подтвредить. Может попросить ввести число
    с генератора в MSAuth/Okta/Duo. Или приложить палец к сканеру отпечатков.

    Тоесть кража самих кукисов - влечет для нас целый квест вопросв и ответов которые нужно
    дальше спрашивть прежде чем сказать что-то утвердительно.
    Ответ написан
    Комментировать
  • Может ли Раст полноценно заменить Джаву в сфере финансовых технологий?

    vabka
    @vabka Куратор тега Rust
    На Java пишется очень много разных вещей, в тч не требовательных к утилизации ресурсов и задержкам так что предположу, что многие вещи просто нецелесообразно переписывать.

    Кроме Java в финтехе вообще много разных языков используется. Даже такая экзотика как Haskell и F# бывает.

    Могу сказать, что сейчас работаю в большой корпорации и мы как раз пишем на Rust штуки, которые отвечают за работу с платёжными системами.

    Раньше примерно то же самое писалось на плюсах.

    На Java такое не писалось, тк авторизация транзакций должна меньше чем за секунду происходить после того как покупатель приложил карту к терминалу, и при этом нужно много разных проверок произвести.
    При этом многомиллионную ораву клиентов спокойно обслуживает не самый мощный сервер (емнип всего 32гб оперативки) с минимальным количеством сбоев.
    Ответ написан
    5 комментариев
  • Как пользователю сохранить созданный файл?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На SO уже есть ответ (ссылка) - он в нижнем примере.

    Подробнее:
    1. Файл отправляется в теле HTTP. Обычно закодирован base64.
    2. В заголовке "Content-Disposition" может быть название файла (самого заголовка может не быть)
    3. Когда браузер принимает файл, то создает свою внутреннюю ссылку на него. Тебе нужно создать свою ссылку (URL.createObjectURL). Потом создаешь тег с полученным URL и "кликаешь" на него (либо п...
    Ответ написан
    Комментировать
  • Почему сервер не разрешает [delete] метод (ошибка 405)?

    petermzg
    @petermzg
    Самый лучший программист
    [HttpDelete("{id}")]
    Ответ написан
    Комментировать
  • В каком репозиторией должна быть логика?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Между слоями Repository и Controller у тебя д.б. слой Service.
    Repository абстрагирует базу данных, т.е. занимается преобразованием объект_языка  <--> запись_БД. Благодаря этому, все остальные классы оперируют привычными им объектами, не заботясь об из происхождении: база данных, очередь, аппарат Луна-25 :)
    Controller обслуживает HTTP-точки - принимает запросы и выдаёт готовые ответы.
    А Service как раз занимается "бизнес-логикой", получая запросы от контроллера, запрашивая данные у репозитория, преобразуя их в готовый ответ и отправляя его обратно контроллеру. Сервис может подключить себе несколько репозиториев если ему требуются данные из нескольких источников, таблиц и пр.
    Ответ написан
    2 комментария
  • Как работает Object?

    Это особый класс, вот он и знает то, чего простым смертным не положено.

    Информация о типе хранится в самом начале экземпляра объекта - по тому даже не обязательно его как-то по особенному переопределять, чтобы что-то работало.

    Вот тебе ещё немного для взрыва мозга:
    Object - ссылочный тип.
    Все структуры - значимые типы.
    Но при этом все структуры каким-то образом наследуют от Object, хотя в обычной ситуации структуры вообще ни от чего наследовать не могут.

    UPD: а во втором случае всё работает, тк все объектынаследуются от object => происходит вполне легальный апкаст (или боксинг в случае int)
    Ответ написан
    2 комментария
  • Что использовать для написания сервера для многопользовательской игры?

    Но насколько я понимаю, HTTP-связь между клиентом и сервером для многопользовательской игры совершенно некорректна.

    Зависит от того, что это за игра. Если это какой-то онлайн-шутер, то да, конечно это будет некорректно, но для какой-нибудь пошаговой стратегии - это будет вполне допустимо.

    Socket.io и SignalR сделаны поверх websocket, который является расширением для HTTP и построен поверх TCP.
    Lidgren network сделан поверх UDP и сейчас активно не поддерживается.

    Прежде чем определить, какой именно тебе протокол и подход будет применим тебе нужно ответить на следующие вопросы:
    1. Какие именно данные (сообщения) нужно передавать
    2. Сколько их будет генерировать один клиент
    3. Сколько клиентов должен держать сервер в рамках одной игровой сессии.
    4. Какие задержки допустимы для каждого из типов сообщений.
    5. Как себя должна вести игра при потере каких-то сообщений и как ты можешь попробовать их компенсировать
    6. Клиентом для тебя является браузер или же десктопное/мобильное приложение, или всё сразу.

    После всего этого ты сможешь определить, какой протокол тебе допустим - это будет http, вебсокеты, или вообще что-то кастомное поверх UDP или TCP.
    Причём для разных типов сообщений ты можешь использовать разный транспорт. Например, для передачи информации о покупках на внутриигровом рынке ты вполне можешь использовать http, а для передачи уведомлений об этих покупках - websocket, а для передвижений персонажей и их действий во внутриигровом мире - UDP, а для загрузки информации о мире и самих игроках - TCP.
    Ответ написан
    6 комментариев
  • Как/Какой лучше создать клиент-сервер для мобильного приложения NET. Maui?

    Пиши на чём умеешь.
    Раз уж уже умеешь C#, то asp net core напрашивается.
    Ответ написан
    Комментировать
  • Как/Какой лучше создать клиент-сервер для мобильного приложения NET. Maui?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Поддерживаю asp net core или азур.

    Хотя можно на чем угодно, подробности тут
    https://learn.microsoft.com/en-us/dotnet/maui/data...
    Ответ написан
    Комментировать
  • Как работать с foreach так чтобы только первый приходил с active?

    @Shavadrius
    Можно решить несколькими способами.
    Например, добавить в передаваемую модель флаг "active" для слайдов:
    <div class="carousel-item @(slider.IsActive ? "active" : "")">

    Или добавить флаг-переключатель непосредственно в код представления:
    @ model HomeVM
    @ bool isFirstSlide = true;
    @ foreach (Slider slider in Model.Sliders) 
    { 
    <div class="carousel-item @(isFirstSlide ? "active" : "")">
    <div class="bg-img" 
    style="background-image: url('../src/img/products/@slider.Image')"></div> 
    </div> 
    isFirstSlide = false;
    }
    Ответ написан
    Комментировать
  • Почему при валидации одной модели подтягиваются свойства из другой?

    Acceptme3
    @Acceptme3 Автор вопроса
    Разобрался с проблемой, если кому вдруг пригодится. Просто вынес инициализацию моделей из ViewModel в соответствующие экшены контроллера перед валидацией.
    Ответ написан
    Комментировать