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

    @basrach
    Квантировать. Также как и делает операционная система с процессами. Процессов много, а центральный процессор один. ОС просто даёт маленький интервал времени каждому процессу, все выполняются по очереди и все счастливы.
    Самый простой способ - разбить весь массив на пачки по 100 (10, 1000), между обработкой пачки делать тупо Thread.Sleep(300 или меньше), давая тем самым обработать запросы серверу. Параметры подобрать экспериментально.
    Ответ написан
  • Как через LINQ вывести из базы данных вместо Id имя пользователя?

    @basrach
    Я не проверял, но должно быть как-то так:
    var transactionList =
    		from transaction in _context.Transactions
    		from destinationUser in _context.Users
    		from destinationUserWallet in destinationUser.Wallets where destinationUserWallet.Id == transaction.DestinationWalletId
    		from sourceUser in _context.Users
    		from sourceUserWallet in sourceUser.Wallets where sourceUserWallet.Id == transaction.SourceWalletId		
    		where destinationUser.Id == User || sourceUser.Id == User
    		select new 
    		{ 
    			sourceUserName = sourceUser.Name, 
    			destinationUserName	= destinationUser.Name, 
    			transaction
    		};
    Ответ написан
  • Почему не работает Property injection в ASP.NET Core MVC через Autofac?

    @basrach
    .RegisterType().As().PropertiesAutowired()

    Этим самым вы сказали, что хотите чтобы Autofac, при создании экземпляра класса Lol произвел инъекцию во всего его (объекта Lol) публичные свойства. Чтобы работал ваш пример, нужно сделать тоже самое но для типа UniversityController.
    А вообще лучше не использовать инъекцию через свойства. Никогда.
    Ответ написан
  • Каким образом делается взаимодействие с hardware в микросервисной архитектуре и Docker-контейнерах?

    @basrach
    COM, USB, принтеры и какие-то специфичные железяки для терминалов - та часть, где код должен быть по определению железо-зависимым. Контейнеры же про диаметрально противоположное, про абстракцию от железа и окружения. Т.е. писать софт для специфичной железяки и запускать его в контейнере, это как в истории про микроскоп и гвозди.
    Вы сделали правильный вывод. Нужно выносить в контейнеры только логику независящую от какого-либо железа или оборудования. А сервисы, взаимодействующие с железом, разворачивать там где и железо.
    Ответ написан
  • Как узнать на что жалуется asp.net iis приложение?

    @basrach
    Классика. А ля "диагноз по фото 16x16px".
    Ошибка в методе RP.WebUI.Arm1Search.SetDataSet(DataSet ds) +16 инструкций от начала метода. Написано же.
    Ответ написан
  • ASP.NET Core как вывести текущих пользователей?

    @basrach
    1) Обработчик всех запросов на уровне Middleware.
    2) Обработчик всех запросов по сессиям.

    А иначе и нельзя. Авторизован пользователь или нет проверяется путем проверки его кук. Сервер не хранит куки всех авторизованных пользователях и соответственно информации нужной вам у сервер нет. Если вам такие данные нужны, то необходимо самостоятельно реализовать сбор и хранение результатов авторизации пользователей. А при помощи чего это можно сделать вам уже подсказали.
    Ответ написан
  • ASP NET Core Identity почему постоянно слетает авторизация?

    @basrach
    Несмотря на то что сами куки присутствуют, у них есть срок действия. Обратите внимание на него, возможно он слишком короткий.
    Ответ написан
  • Использование Nhibernate и Entity framework в одном проекте?

    @basrach
    Уживутся. Подводных камней нет, кроме того что сами можете временами путаться что у вас через EF, а что через Nhibernate.
    Ответ написан
  • Как передать данные между двумя приложениями?

    @basrach
    Обычно для этих целей используют так называемые "очереди сообщений". Данный паттерн, очередь сообщений, широко применим и универсален. Например очередь сообщений можно построить на основе таблицы БД. В составе почти любой ОС от Microsoft есть специальный компонент под названием MSMQ, что является реализацией распределенной очереди сообщений с гарантией доставки и т.д.
    Но чаще всего для ситуаций вроде вашей используют RabbitMq, хотя это уже не просто очередь, а брокер сообщений. Он популярен и у него относительно низкий порог входа. Существует множество библиотек под наверное любой язык. Так что начать работать с ним не составит большого труда. Легко разворачивается. Не требует сложной настройки, если нет особых требований. Настроить нужно только кроме роутинг сообщений. Но если использовать какую-нибудь либу, то и роутинг она может настроить автоматически. Для C# например вот хорошая библиотека. Советую посмотреть в эту сторону.
    Ответ написан
  • OpenIdDict + несколько клиентов и права доступа?

    @basrach
    По сути вам просто нужно взять и настроить готовое решение для SSO. Посмотрите, например, на IdentityServer, его относительно просто установить и настроить. В вашем случае нужно будет просто добавить нужный middleware в pipeline asp.net core.
    Ответ написан
  • Identity asp.net core?

    @basrach
    Вахтершу.
    А так, да. Identity де факто стандарт.
    Ответ написан
  • Можете оценить уровень кода?

    @basrach
    Пунктуация и стилистика бросается в глаза, вы можете аргументировать типа "не на писателя устраиваюсь же", но встречают по одежке, знаете ли...
    По коду.
    Вот вы говорите DDD, а похоже на Transaction Script. Поскольку в классе FeedLoader в каждом не-query методе происходит сохранение изменений, т.е. нет понятия бизнес транзакции. В данном случае это не особо нужно, но раз уж вы про DDD заикались... Также богатой изолированной модели не видно. Возможно в данном случае опять же эту богатую модель неоткуда взять, потому как предметная область тривиальная. Но тогда выходит, что вы выбрали неправильный способ решения задачи. В модуле Core у вас какие-то классы, очевидно для сериализации, непонятно что они делают в Core. Да и вообще, если бы увидел код без описания, мне бы никогда даже не закралась мысль, что его создавали по DDD.
    API не REST, хотя в требованиях было про REST.
    Нет конфигурирования кэша, что, где и насколько кэшировать. При этом само кэширование реализовано в BusinessLayer, что странно, поскольку кэш, как и, например, DataAccess, это чисто инфраструктурные вещи.
    Логирование только в API и только ошибок.
    В тестах нет моков. И похоже что тестирование только интеграционное, т.е. без базы данных не получится протестировать ничего.
    Пустой catch в ApiTester. Да, это не основная кодовая база, но когда не работает и при этом не сообщает почему не работает, всегда бесит, даже если это тесты.
    Итоговая оценка зависит от ваших ожиданий и ожиданий ревьюверов. Если вы junior, и на эту же то позицию претендовали, то вполне неплохо. Если senior, то зависит от уровня ревьюверов/проекта/компании и т.д.
    Ответ написан
  • Как использовать async/await в DI контейнере ASP.NET CORE?

    @basrach
    Посмотрите на сигнатуру второго вызова AddScoped. В Visual Studio это можно сделать наведя указатель на метод.
    Она будет такой: AddScoped>(x => ... Т.е. в контейнере регистрируется не Some, а Task. И это нормально, асинхронный метод всегда возвращает Task. Чтобы зарегистрировать Some, нужно чтобы лямбда внутри AddScoped была синхронная, этого можно достичь написав либо ...GetSomeAsync().Result, либо еще как-то получить результат, и непосредственно его уже возвратить.
    Ответ написан
  • ASP.NET Core: сколько должно быть конфигов дли разных баз данных и как их распределить по контроллерам?

    @basrach
    Вам нужны два разных контекста. Контексты, это те классы, которые наследуются от DbContext, и абстрагируют доступ к БД. Один для одной базы, другой для второй базы. Соответственно и конфигов у вас будет по числу баз данных, т.е. тоже два.
    Ответ написан
  • Почему не инициализируются свойства сервиса при добавлении через AddTransient в ASP.NET Core?

    @basrach
    Потому что встроенный DI контейнер ASP. Net Core не поддерживает инъекцию свойств и полей.
    А методом services.Configure вы на самом деле регистрируете опции, которые можно потом получить так: IOptions
    Т.е. вам нужно сделать так:
    services.AddTransient<IEmailService, EmailService>();
    services.Configure<EmailServiceOptions>(options =>
    {
        options._emailAddress = "email";
        options._emailPassword = "password";
        options._name = "name";
    });
    
    class EmailService
    {
      public EmailService(IOptions<EmailServiceOptions> optionsAccessor)
      {
        _emailAddress = optionsAcessor.Value.EmailAddress;
        ....
      }
    }
    Ответ написан
  • Как ускорить время запуска первой страницы (страницы авторизации)?

    @basrach
    Если задержка 5-7 секунд, то скорее всего это связано с остановкой ApplicationPool-а. При отсутствии запросов в течении некоторого времени (по умолчанию 20 мин) IIS останавливает процесс, который обслуживает ап-пул сайта. Соответственно, если приходит запрос и пул остановлен, то IIS-у нужно запустить процесс, поднять все модули для сайта, сам сайт загрузить и запустить, и только после всего этого сайт будет готов обрабатывать запросы. Отсюда такая значительная задержка при первом запросе, все последующие запросы будут обрабатываться быстро.
    Чтобы изменить это поведение нужно в IIS-Manager выбрать пул, затем Advanced Settings и там два параметра: "Idle Time-out" и "Idle Time-out Action". Последний отвечает за действие после истечения таймаута, по умолчанию там стоит Terminate, т.е. прерывать процесс, можно изменить на Suspend (приостановить но не убивать процесс). Также там есть параметр "Start Mode", и там стоит по умолчанию OnDemand (по запросу), можно изменить на AlwaysRunning (т.е. всегда запущен).
    Но стоит учесть, что постоянно запущенный процесс ап-пула будет потреблять немало памяти и некоторое количество процессорного времени, и если приложение используется редко, то по сути в холостую расходовать ресурсы сервера.
    Ответ написан
  • Как заставить работать сайт на iis без запросов к сайту?

    @basrach
    1. Найти файл настроек IIS: %WINDIR%\System32\inetsrv\config\applicationHost.config
    2. В этом файле найти секцию applicationPools, найти там нужный appPool, добавить/заменить атрибуты на autoStart="true" startMode="AlwaysRunning", должно быть типа такого:
    <applicationPools>
      <add name="DefaultAppPool" autoStart="true" startMode="AlwaysRunning" managedRuntimeVersion="v4.0">

    3. Найти секцию sites, в ней нужный site, а там нужный application и добавить туда в тег application два атрибута: serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"
    <sites>
        <site name="Default Web Site" id="1" serverAutoStart="true">
            <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"

    4. Ниже, прямо после секции sites или перед закрытием тега system.applicationHost добавьте:
    <serviceAutoStartProviders>
        <add name="ApplicationPreload" type="MyNamespace.ApplicationPreload, MyAssembly" />
    </serviceAutoStartProviders>

    Обратите внимание! Значение name должно совпадать с значением serviceAutoStartProvider.
    Значением type должно быть полное имя класса-загрузчика (неймспейс, сборка), который будет запускать quartz при старте сайта.
    5. Реализовать собственно класс-загрузчик:
    public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
    {
        public void Preload(string[] parameters)
        {
            // Qurtz.Net.Start() // или как там хз
        }
    }


    При этом надо помнить, что пул может быть всё равно "прибит" IIS-ом, например, если исчерпан лимит по памяти. Необработанное исключение в вашем коде может его также остановить. Но после остановки он должен сразу же запускаться. Т.е. нельзя надеяться что некий код будет работать 24/7. Он будет прерываться, но сразу же запускаться.

    Также, лучше код запуска qurtz-а (тот что в методе Preload(string[])) повторить в методе Application_Start в Global.asax для надежности.
    Ответ написан
  • EntityFramework - можно ли "скрестить" контексты?

    @basrach
    Можно.

    Контексты не знают друг о друге ничего, и нет никакой разницы, создаете вы два экземпляра одного класса контекста, или два экземпляра разных классов контекстов. Каждый экземпляр полностью изолирован и функционирует так, будто он один на свете. Т.е. в него можно пихать любые таблицы/сущности и мапинги лишь бы они были корректны с точки зрения схемы бд.
    Единственный минус возможно заключается в том, что какие-то маппингы придется дублировать в двух местах. Таким образом возможно могут быть нарушены принципы вроде DRY и еще какие-нибудь. Но, как предложили выше, наследование закрывает этот вопрос.
    В любом случае окончательно решение нужно принимать с учетом всех особенностей вашей архитектуры.
    Ответ написан
  • Насколько ли плохи дефолтные контроллеры в ASP.NET MVC???

    @basrach
    Зависит полностью от вашей задачи. Вот сделали вы там что-то. Если это вас устраивает полностью, всё работает как надо, "они делают всё что необходимо" то значит и контроллеры и прочее - отличные. Может статься, что проект будет расти и усложняться. Когда дефолтные контроллеры + EF без дополнительных слоев абстракции перестанут "делать всё необходимое", а наоборот начнут только усложнять вам жизнь. Тогда вы сами поймете насколько и чем они плохи. До тех же пор, абсолютно ничего плохого в них нет.
    Ответ написан