• ASP NET Core Identity почему постоянно слетает авторизация?

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

    @basrach
    string serverName = null;
    	var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
    	Task.Run(() => serverName = Server.GetServerName(), cancellationTokenSource.Token);


    В таком случае вызов Server.GetServerName() будет происходить в фоне и не заблокирует основной поток. Теоретически через 30 секунд задача будет отменена. Но по факту задача будет висеть в режиме ожидание ответа по сети до тех пор, пока ответ не придет, и только после того как придет ответ будет выбран свободный поток из пула, который возьмет эту задачу для продолжения выполнения и возможно прервет её, но возможно что и не прервет.

    Если вам гарантированно нужно чтобы задача не выполнилась после истечения 30 секунд, то нужно переделать метод GetServerName() следующим образом:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    	
    	cancellationToken.ThrowIfCancellationRequested();
    }

    либо:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    
    	if (cancellationToken.IsCancellationRequested)
    	{
    		return;
    	}
    }

    ну и соответственно его вызов будет выглядеть в таком случае вот так:
    Server.GetServerName(cancellationTokenSource.Token)
    Ответ написан
    Комментировать
  • Как маппить пакеты по opcode?

    @basrach
    Профессионалами реализуется через switch-case - наиболее понятный для тех кто будет поддерживать и эффективный способ. В качестве же упражнения, либо если вы работаете не в команде, можно попробовать через кодогенерацию, reflection и что еще в голову придет.
    Ответ написан
    Комментировать
  • Почему не работает UPDATE c#?

    @basrach
    prodBrand = brandUsers.brand

    просто строка, нужно либо string.Format(), либо интерполяцию использовать, либо параметры команды (что лучше всего)
    Ответ написан
  • Использование Nhibernate и Entity framework в одном проекте?

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

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

    @basrach
    Если то, что вводит пользователь соответствует грамматике языка C#, то ставите nuget пакет Microsoft.CodeAnalysis.Scripting и дальше просто:
    var userInput = "3*3";
    var result = await CSharpScript.EvaluateAsync<int>(userInput);
    Console.WriteLine(result); // 9
    Ответ написан
    Комментировать
  • OpenIdDict + несколько клиентов и права доступа?

    @basrach
    По сути вам просто нужно взять и настроить готовое решение для SSO. Посмотрите, например, на IdentityServer, его относительно просто установить и настроить. В вашем случае нужно будет просто добавить нужный middleware в pipeline asp.net core.
    Ответ написан
    Комментировать
  • C# Request.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult() можно ли вызвать два раза подряд на одном Request?

    @basrach
    По факту эти методы перечитывают поток. В данном случае "поток" чисто абстракция, а данные на самом деле лежат в памяти. В принципе, если вызвать ReadAsStreamAsync на Response.Content, прочитать этот поток и закрыть его, а затем еще раз попытаться прочитать, то тоже будет исключение. В дот.нет конкретно эти два метода реализованы так, что они не закрывают поток после использования, а читают каждый раз его сначала.
    Допустимо ли это? С чисто технической стороны, если это работает, то почему бы и нет. А не с технической нужно руководствоваться принципом наименьшего удивления.
    Ответ написан
    1 комментарий
  • Identity asp.net core?

    @basrach
    Вахтершу.
    А так, да. Identity де факто стандарт.
    Ответ написан
    Комментировать
  • Если ли готовое решение перевода с big endian в little endian?

    @basrach
    Готовое и простое решение навряд ли найдете. Потому что перевод зависит от семантики данных. Условно говоря, то что будет переводить должно понимать где у вас значение из двух байт, где из восьми, а где из одного. Это одна из тех задач, которую будет быстрее и проще разобраться и решить самому, чем потратить кучу времени на поиск и неудачные пробы готовых решений. Написать можно и на C, и на PHP, и на JS.
    Ответ написан
    Комментировать
  • C# Как освобождать оперативную память завершенных Task'ов?

    @basrach
    Сам Task, это класс с ~10 полями по 4 байта. Можно посчитать сколько займут в памяти 2000 штук. Очевидно проблема не в них. Как выше уже отметили, проблема не в самих тасках как таковых, а в том коде, который исполняется посредством тасков. И даже не в потоках. Попробуйте создать 2000 настоящих потоков (new System.Threading.Thread(...)) и выполнить там тривиальный код, навряд ли они смогут выжрать 10GB памяти.
    Проблема в коде, который вы запускаете в этих тасках. Если вы не знакомы с автоматическими сброщиками мусора, то нужно про них почитать.
    Любой код на C# - это плюс/минус метод. Создавая таск вы передаете ему ссылку на метод, который нужно выполнять, метод может быть именованным либо анонимным, неважно. Проблема в том, что по завершении этого метода, ресурсы, которые были использованы в этом методе не освобождаются. Неважно где исполняется метод: в таске, в потоке, просто так в основном потоке приложения. Вам нужно добиться того, чтобы при выходе из метода, которые вы передаете таску, все ресурсы использованные в этом методе были освобождены.
    Если вы незнакомы со сборщиком мусора в CLR, то почитайте обязательно, да и вообще про сборку мусора.
    В данном же ситуации, не видя кода, могу только посоветовать следующее. Далее для упрощения понимания будем считать, что у нас всего два участка кода: некий метод (это то что вы передаете в таск), и основной поток (вся остальная программа):
    1) Если что-то создаете (вообще везде, а в методе особенно), любой класс, если у него есть метод .Close() или Dispose(), то обязательно вызывайте этот метод после того как класс вам больше не нужен.
    2) Если есть возврат результата из метода, проверьте не возвращается ли сверх того, что вам нужно. Например, возвращается класс, с двумя полями, одно число, другое массив. Вам нужно из этого только число. Соответственно, поле с массивом нужно убрать из возвращаемого значения.
    3) Упростите возвращаемый результат насколько это возможно. Например вам нужно подсчитать сумму элементов в N массивах. Вы запускаете N потоков и возвращаете N массивов, т.е. из каждого метода по массиву, а потом в основном потоке суммируете длины всех массивов. В этом случае как раз будет ощущение утечки памяти. Нужно возвращать сразу длину массива. И т.д.
    4) Если есть добавление элементов из метода в коллекцию, которая объявлена в основном потоке. Проверить, очищается ли эта коллекция при выходе из метода. Или не добавляется и слишком много в эту коллекцию. Или Возможно в эту коллекцию добавляются слишком большие массивы и т.п.
    5) Почти то же что и предыдущий пункт. Если есть какая-либо статическая коллекция или статические поля, переделайте на нестатические везде где возможно. А где невозможно, проследите чтобы в такую статическую коллекцию не добавлялись элементы из метода. Или если добавляются, то проверьте размер элементов, он должен быть минимальный.
    6) Проследите, что не создаете больших массивов размером более 80кб. Если создаете, Измените на меньший размер если возможно. Например, если стоит задача подсчитать количество символов в файле, то не нужно читать его в память. Достаточно в цикле считывать по 8кб и суммировать результат.
    7) Последнее. Перед выходом из метода вставьте:
    System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;
    System.GC.Collect();
    Ответ написан
    Комментировать
  • Можете оценить уровень кода?

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

    @basrach
    как из дочернего потока завершить родительский.

    Потоки не имеют отношений между собой типа родительский/дочерний. Соответственно завершайте так как и всегда:
    var parentThread = new Thread(..
    ...
    parentThread.Abort();
    Ответ написан
    Комментировать
  • Что исправить в строке подключения к базе данных Entity Framework C#?

    @basrach
    Для того чтобы переносить базу данных вам нужно выбрать что использовать для начала:
    1) Sql Server CE (Compact Edition) - урезанный движок, который можно таскать с собой в виде библиотеки. Но он deprecated с 13 года.
    2 ) Sql Server LocalDB. Но его нужно устанавливать отдельно на каждой машине. Он поставлялся раньше вместе с VisualStudio, сейчас не знаю.
    3) sqlite, которая будет работать везде, но у нее есть свои минусы.
    4) Использовать обычный инстанс Sql Server (возможно Express, не важно), и таскать с собой только базу.
    В зависимости от того что вы выберете будет меняться строка подключения. Сейчас она у вас для обычного инстанса Sql Server:
    data source=DESKTOP-K4U1293;initial catalog=IPhoneDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework
    .
    Например для варианта 4, нужно ее изменить на:
    Server=DESKTOP-K4U1293;AttachDbFilename=|DataDirectory|mydbfile.mdf;Database=IPhoneDB;
    Trusted_Connection=Yes;
    .
    Для варианта 2:
    Server=(localdb)\v11.0;Integrated Security=true;
    AttachDbFileName=|DataDirectory|mydbfile.mdf;

    Вт тут много примеров.
    Ответ написан
    Комментировать
  • Какой выбрать тип данных в классе datetime или string?

    @basrach
    Используйте DateTime?, с вопросительным знаком. Это как обычный DateTime, только он может иметь значение NULL. Он специально создан для таких случаев.
    Ответ написан
    Комментировать
  • Как сделать задержку с интервалом?

    @basrach
    Красиво будет сделать вот так:
    1) Установить пакет System.Reactive
    2) Дописать:

    ...
    private Subject<int> myHotkey = new Subject<int>();
    
    public MainForm()
    {
        ...
    
        myHotkey
            .AsObservable()
            .Throttle(TimeSpan.FromSeconds(1))
            .Subscribe(hotkeyid => MessageBox.Show("Нажата горячая клавиша с ID:  " + hotkeyid));
    }
    
    ...
    
    protected override void WndProc(ref Message keyPressed)
    {
        ...
                switch (keyPressed.WParam.ToInt32())
                {
                    case 1: 
                    {
                        SetPrtSc(); 
                        myHotkey.OnNext(keyPressed.WParam.ToInt32());
                    }
                    break;
    ...
    Ответ написан
    Комментировать
  • Как передать функцию в c#?

    @basrach
    Delegate (с большой буквы) - это статический класс, которые содержит методы для работы с делегатами. Сам же делегат нужно объявить через ключевое слово delegate (с маленькой буквы), как класс или интерфейс. Например:
    public delegate void TestDelegate(string message);
    При этом использовать вы можете только конкретный тип делегата, точно также как вы используете конкретный MyClassи т.п., а не само ключевое слово class. В приведенном примере тип делегата будет TestDelegate. Чтобы передать с помощью делегата ссылку на функцию, сигнатуры функции и делегата должны полностью совпадать. В случае приведенного примера TestDelegate, функция должна также возвращать voidи принимать string.

    В вашем случае тип делегата должен быть такой: public delegate void MyDelegate(); Этому делегату вы можете присвоить ссылку на ваш метод void init().
    Но свой тип делегаты в данном случае объявлять нет необходимости. В Net. Framework уже есть целый ряд делегатов, как раз для таких целей. Это Func и Action.
    Вы можете просто заменить слово Delegate на Actionв вашем коде, и всё должно работать.
    Ответ написан
    Комментировать
  • Как подставить header в POST, C#?

    @basrach
    1. Сначала вам нужно разобраться какой тип авторизация используется: Basic Auth, Bearer Token, NTLM и т.д.
    2. Начинать писать код:

    using System.Net.Http;

    Выполнение запроса без авторизации:
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("MyHeader", "MyHeaderValue");
    var response = client.PostAsync("https://toster.ru", new StringContent("{\"Data\": \"Test\"}")).Result;
    	
    Console.WriteLine(response.Content.ReadAsStringAsync().Result);


    Basic авторизация:
    var username = "username";
    var password = "password";
    	
    var authValue = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
    	
    var client = new HttpClient();	
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authValue);
    client.DefaultRequestHeaders.Add("MyHeader", "MyHeaderValue");
    var response = client.PostAsync("https://toster.ru", new StringContent("{\"Data\": \"Test\"}")).Result;
    	
    Console.WriteLine(response.Content.ReadAsStringAsync().Result);


    Bearer token:
    var token = "token"; // вам нужно где-то получить токен
     	
    var client = new HttpClient();	
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
    client.DefaultRequestHeaders.Add("MyHeader", "MyHeaderValue");
    var response = client.PostAsync("https://toster.ru", new StringContent("{\"Data\": \"Test\"}")).Result;
    	
    Console.WriteLine(response.Content.ReadAsStringAsync().Result);


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