Задать вопрос
Ответы пользователя по тегу C#
  • Как реализовать TcpLister, который будет ожидать запроса?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Зависит от того, чего вы хотите.
    Если вас устраивает, что задача, выполняющая HandleClientAsync для подключившегося клиента будет брошена на произвол судьбы, можно использовать оба варианта (но первый мне нравится больше). Если вы хотите узнать, чем она закончилась - надо делать по-друому.
    PS См. также комментарии к вопросу.
    Ответ написан
    Комментировать
  • Консоль выдаёт ошибку в коде хотя там её явно не видно, как можно решить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Смотреть, если не умеючи и без привычки, можно долго и бестолку.
    А чтобы посмотреть быстро и толково, разрабочики IDE дали нам отладчик.
    Судя по сообщению об ошибке, у вас список GeneratedRooms пустой (потому что ничего нет даже в начальной позиции - 0). Так что начать можно с того, что поставить в строке 143 точку останова и убедиться в этом.
    А можно сразу начать разбираться, почему он пустой: поставить точку останова (breakpoint) там, где этот список пополняется - у вас такое место одно, строка 106, где в этот список добавляется результат некой функции - и пройти в отладчике по шагам работу этой функции: начать с проверки ее параметров, затем смотреть, что управление пошо туда, куда вам надо и переменные имеют ожидаемое значение. Можно даже сразу поставить точку останова в начале функции, если она у вас ниоткуда больше не вызывается.
    Ответ написан
    3 комментария
  • Как корректно завершить webapplication, чтобы вызвался и исполнился до конца IHostLifetime.ApplicationStopping.Register(mymethod)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Для ответа на вопрос несколько не хватает информации - как у вас организована реакция на отмену IHostApplicationLifetime.ApplicationStoping (что и как делает регистрируемый callback при отмене), какие сервисы вы используете и как они реагируют на отмену того же маркера.
    И IMHO информацию лучше собирать методом проб и ошибок. Самое первое, что вы можете попробовать - это такой вариант. Во-первых, нужно зарегистрировать свой callback последним. А для этого нужно вызвать конструкторы всех сервисов в надежде, чо если они и регистрируют callback на этот маркер, то делают это у себя в конструкторах и только потом регистрировать свой callback (если вы эти сервисы получаете путем внедрения зависимостей через конструктор, это получится автоматически). Во-вторых, нужно выполнить всю работу в своем callback синхронно, в частности, если сообщения отправляются сервисами асинхронно, то подождать завершение каждого (Tasl.WaitAll вам в помощь), а не ждать каждый через await (или явно - используя ContinueWith - но сейчас так никто не делает).
    Идея рассчитана на то, что реализация IHostApplicationLifeTime отменяет (ЕМНИПпроверено в исходниках) этот маркер простым Cancel и ждет завершения отмены (и в документации об этом ожидании смутно упомянуто, т.е., это не хак, зависящий от реализации) , а Cancel вызывает все зарегистрированные callback синхронно, в порядке, обратном регистрации (это ЕМНИП тоже документированнное поведение).
    Попробуйте для начала так, прежде чем применять более крутые меры (например, подменять реализации IHostLifeTime и IHostApplicationLifetime(UPD: погорячился, эту реализацию подменять нельзя, там обязан быть класс ApplicationLifetime) - технически это реально, но лучше такое оставить на потом).
    Если не прокатит, я ответ постараюсь продолжить.

    PS По поводу способов закрытия приложения. AFAIK остановка через "красный квадратик" в VS и закрытие окна консоли вызывает просто уничтожение процесса, и это не перехватывается (могу ошибаться, конечно). А вот закрытие по Ctrl+C отлично перехватывается ConsoleLifeTime (обычно испольуемая для консольных приложений реализация IHostLifetime), так что именно этот способ закрытия можно считать штатным. А вообще по жизни, 100% срабатывающих способов реакции на прекращение работы приложения нет - ибо прекращение может быть вызвано такой причной, как пропадание питания (особенно - если вследствие перерубания кабелей топором ;-) ).
    Ответ написан
    1 комментарий
  • Есть ли такая архитектура?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Есть несколько соображений.
    Сображение первое, глубоко теоретическое. Логическая структура конкретного приложения - это вопрос специфичный именно для приложения. Думать о ней в терминах соответствия некой теоретической "архитектуре" (тем более - "чистой архитектуре") - это самоограничение, достойное только зеленых новичков. Настоящие программисты не используют чистую архитектуру. Кароче, как вы приложение напишете, такая у него архитектура и будет. Возможно, если ваше приложение будет в чем-то замечательным, то эта архитектура войдет в учебники по этой самой архитектуре, в качестве примера (может - положительного, но, скорее, отрицательного ;-) ). Но пока что вам нужно решать практические вопросы, и шаблоны т.н. "архитектуры" могут служить только в качестве подсказки, а решать придется вам, из чисто практических соображений.

    Соображение второе, практическое. Раз, как вы пишете "Domain содержит только сущности, Enum'ы", то выбросьте из головы слово Domain, оно вас только запутывает. Потому что намекает на DDD, а то, что у вас есть, в DDD обзывают "анемичной моделью", и сильно не любят. Т.е. сейчас, с нынешней структурой приложения, DDD - оно не про вас.

    Так что, по факту, у вас есть два слоя абстракций, описывающих функции классов и методов: UI и Application. И я подозреваю, что логика приложения - классы и методы, отнесенные к Application - использует в качестве средства доступа к БД EF напрямую. То есть - что там прямо в коде используются сущности под названием DbContext и DbSet.

    А это означает, если по жизни, что от EF вы в таком раскладе никуда впоследствии не денетесь. Хорошо это или плохо - решать вам. Однако о намерении прибить гвоздями свое приложение к EF вы не упоминали и, предполагаю, не думали. Если это так, то задумайтесь именно об этом. Не о замене БД - EF может работать поверх разных БД, так что к MS SQL вы, по факту, с EF привязаны не будете (ну, разве что, сами того очень захотите).

    А задуматься надо: EF - штука неоднозначная. Она, подобно любому средству ORM, полна абстракций, которые, так скажем, не совсем хорошо ложатся на логическую структуру реляционных БД, а потому в них есть заметные дыры, через которые эта структура будет проглядывать. В частности, это нередко касается вопросов производительности.

    Но если вы выберети жизнь EF и ни с чем другим, то о Repository и UoW можете больше не думать: EF будет для вас и тем, и другим.

    Кароче, выбирайте.
    Ответ написан
    7 комментариев
  • Как написать свой кастомный EditorFor и получить значение свойства модели?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    У вас в поле _helper класса FormHelper<TModel> конструктор сохраняет ссылку на интерфейс IHtmlHelper<TModel>.
    Этот интерфейс содержит свойство ViewData типа ViewDataDictionary<TModel>. А в этом типе реализовано свойство Model (типа TModel), которое даст вам ссылку на экземпляр класса (типа TModel) модели для представления/страницы.
    Ну, а дальше, раз вы знаете имя нужного вам свойства объекта и имеете ссылку на экземпляр этого объекта, то можете получить значение этого свойства: либо через составление с последующей компиляцией и вычисление выражения, возвращающего его значение, либо через отражение.
    Как-то так.
    Ответ написан
    1 комментарий
  • Как удалить сессию из БД после истечения срока?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В ASP.NET Core есть стандартный механизм сеансов (ISession): https://learn.microsoft.com/aspnet/core/fundamenta...
    Работает он на базе распределенного кэша (IDistributedCache), который штатными средствами можно базировать на MS SQL и на Redis (и, возможно, есть дополнительные сторонние пакеты для базирования на других СУБД,). Идентифкатор сессии хранится в куки (настраеваемой), по умолчанию - HTTP-only (но это настраивается).
    Механизм устаревания сеансов там есть, параметры тоже можно настроить.
    Кароче, если нет причин обязательно делать свой велосипед (типа, для учебной задачи) можно использовать этот стандартный механизм.
    Правда идея использовать этот механизм именно для авторизации у меня вызывает некоторые неясные опасения: он, вообще-то, не для того сделан. А именно для авторизации (плюс аутентифкация) в ASP.NET Core тоже есть штатное решение (Identity и политики авторизации). И вообще, аутентифкация/авторизация - это такое место, где легко накосячить, а потому лучше там обходиться без своих велосипедов.
    Ответ написан
    3 комментария
  • Возникла ошибка в примерах от LLamaSharp?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Добавьте в начало файла строку using System.Linq;
    чтобы указать компилятору искать методы расшерения в этом пространстве имен.
    ToList() - это метод расширения для интерфейса IEnumerable<Matches>, который реализуется объектом, который возвращает метод Regex.Matches. Этот метод определен (как обобщеный, для IEnumerable<T>) в классе Enumerable из пространства имен System.Linq.
    PS Подозреваю, что у автора примера ссылка на это пространство имен живет в Global Usings, а потому у него все работает, а у вас - нет.
    Ответ написан
  • Почему связи в таблице работают неправильно?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Надо изменить поведение внешних ключей при удалении. Если, как я полагаю, вы рабоаете с EF Core, то для этого в OnModelCreating нужно вызвать метод OnDelete (информация, ссылка на документацию и примеры - здесь).
    В EF6 (для .NET Framework) вместо этого был метод WillCascadeOnDelete(false)
    Ответ написан
  • C# 7.3 Как мне вызвать асинхронный метод, находящийся в отдельном файле?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Task (задача) - это не Thread. Это спрецифичный для исполняющей системы (CLR) .NET объект, который позволяет отследить завершение выполнения операции, выполняющейся независимо от вашего основного потока управления и получить результат выполнения, если он есть (в вышем случае результата нет). Для запуска задачи, которую возвращает асинхронный метод (в отличие от вновь созданного объекта задачи - new Task(...)) ничего делать не нужно - она уже запущена исполняющей системой. Поток (Thread) для ее выполнения, если он нужен (а нужен он не всегда, иногда задача завершается внутри асинхронного метода синхронно) обычно берется из пула потоков (но могут быть нюансы, если они вам интересны - читайте про SynchronizationContext).
    Если вам нужно дождаться выполнения задачи в синхроннном коде (у вас сейчас такой), то следует использовать метод задачи Wait(), но он заблокирует основной поток. Альтернатива для современного .NET (7.3 для этого достаточно современный) - использовать асинхронный метод Main: просто указать static async Task Main() вместо static void Main. Тогда можно дожидаться выполнения Install асинхронно, с помощью операции await: await update.Install(); При этом основной поток блокироваться не будет, но если ему все равно делать нечего (это зависит от типа приложения), то выигрыша от этого не будет (в консольном приложении, например).
    PS Зачем вы применили атрибут [STAThread] к метод Install? Ведь, согласно документации
    Примените этот атрибут к методу точки входа (Main()метод в C# и Visual Basic). Это не влияет на другие методы
    То есть, он тут бессмысленнен. И вообще, это - тяжкое наследие технологии OLE2/COM.
    Ответ написан
    1 комментарий
  • Один или несколько проектов в решении не были загружены?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вам нужен ответ на вопрос в заголовке?
    Если так, то да, проект C:\Users\Acer\Downloads\Imash.App\Imash.App.csproj не был загружен: вероятно отсутсвует одна из папок в пути. Можете сами проверить в Проводнике, какая именно.

    PS Или вы что-то другое спросить хотели?
    Ответ написан
    1 комментарий
  • Почему некорректно работает параметр маршрутизатора Razor Pages?

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

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Судя по вашему сегодняшнему вопросу, в котором вы пытаетесь решать эту задачу дальне вам нужно сделать эту работу на уровне БД.
    Если так, то для этого многие (хоть и не все, но, к примеру, в MS SQL Server и в PostgreSQL она AFAIK есть) СУБД имеют функциональность reursive CTE.
    Попробуйте поискать решение в этом направлении.
    Ответ написан
    Комментировать
  • Cannot convert return expression of type, C# generic method, как вернуть конкретный тип?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    T - это параметр-тип обобщенного метода. Как и все параметры, этот параметр задается извне, при вызове конкретной специализации обобщенного метода. И, кстати, компилятор вообще не может знать, что T может принадлежать к одному из трех перечисленных типов: их проверка, с выбрасыванием исключения, производится уже во время выполнения.
    Так что изнутри метода, если вы хотите его сохранить, а не выкидывать, придется вам возвращать Object и разбираться с типом возвращенного значения уже после вызова. Причем, возврат Object вместо числового типа - это ещё и лишние накладные расходы на упаковку/распаковку (box/unbox). Так что я бы на вашем месте этот метод выкинул.
    Ответ написан
    Комментировать
  • Как исправить "Input string was not in a correct format."?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Полагаю, вы хотели подставить между знаками процента значение из поля ввода (txtSearch.Text), которое передается в string.Format? В таком случае надо между фигурным скобками подставить порядковый номер параметра (он начинается с 0): string.Format("%{0}%", txtSearch.Text)

    PS Из соображений безопасности (чтобы избежать SQL-инъекции) крайне не рекомендуется напрямую копировать в строку запроса сырые, непроверенные, данные из ввода пользователя - а вы сделали именно так. В учебной задаче это допустимо, но лучше сразу привыкать делать по уму: например, использовать в строке запроса параметры и передавать ввод через них.
    Ответ написан
    Комментировать
  • Возможно ли передать параметром экземпляр HttpClien в другой класс?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Рекомендуемые варианты использования есть в документации Microsoft. Краткая цитата оттуда:
    Чтобы суммировать рекомендуемое HttpClient использование с точки зрения управления временем существования, следует использовать либо долгосрочные клиенты, либо задать PooledConnectionLifetime (.NET Core и .NET 5+) или краткосрочные клиенты, созданные IHttpClientFactory.

    Как видите, один клиент на все приложение (т.е. долгосрочный) - это только один из вариантов. Выбирайте тот вариант, который вам больше подходит (они все там описаны в документации, рядом) и пользуйтесь.
    Ответ написан
    2 комментария
  • Как сформировать Json из массива?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вы не инициализуете сами массивы (не содаете для них объекты типа Inline_Keyboard[]) нижнего уровня: rootobject.inline_keyboard[0] и rootobject.inline_keyboard[1]. Ну, и rootobject.inline_keyboard[2] тоже стоило бы создать IMHO.
    Ответ написан
    Комментировать
  • Почему не находит файл C# в csc?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Имя_файла.cs ищется относительно вашего текущего каталога - того, в котором вы находились, когда ввели команду с csc.exe. Его имя пишется в приглашении командной строки. Вот и посмотрите, из какого каталога вы запускаете команду, и есть ли там нужный файл.
    Ответ написан
  • Почему миграция данных происходит, а обновление базы нет из-за нарушения ограничения внешнего ключа?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    CityzenUNDEAD, сообщение об ошибке означает, что у вас таки действительно кривые данные, а именно - есть минимум одна запись в RiskLevels со значением поля OrganizationControlId = 0, для которой в таблице OrganizationControl нет записи с таким же значением первичного ключа (как я понял - поля Id).
    Вывести все такие записи из RiskLevels, которые ссылаются на отутствующие записи в OrganizationControl, можно SQL-запросом
    SELECT * FROM RiskLevels WHERE OrganizationControlId!=ALL(SELECT Id FROM OrganizationControl)

    И пока такие записи есть, наложить ограничение внешнего ключа не поле RiskLevels.OrganizationControlId у вас не получится. Ищите и разбирайтесь, что с этими записями делать.

    PS Entity Framework - он шибко умный, он сам находит связанные друг с другом поля, сам добавляет поля для чего-нибудь типа первичного ключа и т.д. Так что не удивляйтесь, что EF умничает, а если не хотите этого - жестко его контролируйте.
    Ответ написан
    Комментировать
  • Как загнать в dictionary key как null?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Условный оператор в возвращаемом выражении в лямбде в GroupBy формально имеет тип результата int?, и у ситаксического анализатора при выводе типа возвращаемого значения не хватило то ли мозгов догадаться, что результат не может быть null, то ли полномочий изменить тип возвращаемого выражения на int.
    Упростите ему задачу: используйте операцию объединения с null (?? - null-coalescing), тип ее результата гарантированно не-nullable:
    asd.Value?.GroupBy(x => x.ParentId??0 ).ToDictionary(gg => gg.Key, gg => gg.ToList());
    Ответ написан
    Комментировать
  • Как ограничить количество запросов на сервер при создании поисковика?

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