Задать вопрос
  • Есть ли смысл завершать задачи генерируя ошибку(token.ThrowIfCancellationRequested()) если есть спобос получше?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во-первых, ваш заголовок вводит в заплуждение: в нем - про завершение процесса, а справшиваете вы про завешение задачи.
    Во-вторых, задача может завершаться переходом в разные конечные состояния (они фиксируются в поле Task.Status). По оператору Return задача переходит в состояние RanToCompletion, по ThrowIfCancelationRequested - Canceled. Это - два логически разных состояния завершения (есть еще и третье - завершение по необработанному исключению, Faulted). Если коду, создаывшему задачу, совсем без разницы, как именно завершилась задача и вообще, завершилась ли она, то можете делать как угодно.
    Но, очень часто код, связанной с задачей,к примеру, операция await для задачи, ведет себя по-разному, в зависимости от состояния завершения задачи, получение результата задачи - тоже. А для задачи продолжения можно задать условия, при каком состоянии завершения предыдущей задачи эта задача продолжения будет запущена. То есть, состояние завершения задачи обычно имеет значение.
    Ответ написан
    Комментировать
  • Как пройтись циклом по результирующим данным функции?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Естественно не можете, потому что ServiceResult у вас IEnumerable не реализует (про это написано в сообщении об ошибке). А IEnumerable, по которому можно пройтись - это параметр-тип для ServiceResult, и до значения этого типа еще надо добраться.
    Разберитесь, что это у вас за обобщенный тип - ServiceResult (похоже, это из какой-то сторонней библиотеки), найдите в нем свойство типа T (или метод, возвращающий T) - который тип T в вашем случае - это IEnumerable - и пройдитесь циклом foreach по значению этого свойства (или результату, возвращенному методом).
    PS Если не найдете - дайте больше информации по используемым библиотекам (пакетам NuGet и т.п.), иначе придется вам ждать телепатов или ясновидящих, чтобы они эту информацию нам передали.
    Ответ написан
    Комментировать
  • Как подключить firebase к .net Maui?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1. При подключении проект никак не может найти файл google-services.json, не смотря на то, куда я его только не пихала. Он как находился в корневой папке проекта, как и в папке Android.
    для начала посмотрите свойства проекта и целевую папку компиляции (могут быть две - debug и release, на этапе разработки по дефолту debug). попробуйте положить туда.
    если поможет - можете включить google-services.json в состав проекта, в любом удобном для разработки расположении. потом в свойствах файла (обозреватель решений) указать что то вроде "копировать в выходной каталог" (просто по памяти цитирую). соответственно и файлик можно править прямо в студии, и копироваться будет при каждой пересборке. уже как в дебаг, так и в релиз, и при публикации на внешний ресурс/устройство.

    ps если шаблон проекта имеет свои конфигурационные паки изначально, значит просто надо скопировать в прототип этих папок в проекте (если их более одной - разобраться с назначением и выбрать подходящую), и ручками добавить файл в проект (в обозревателе найти пиктограмму "показать все файлы" и включить в состав). возможно просканировать шаблон на предмет стиля обращения к таковым папкам

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

    @Plasmat1x Автор вопроса
    Зеленый программист/системный администратор
    Решение:
    @model UserRolesViewModel
    
    @{
    
    }
    
    <div>
        <h1>@Model.UserName</h1>
    
        <div>
            <form asp-area="admin" asp-controller="Users" asp-action="AddRole" method="post" enctype="multipart/form-data">
                <input type="hidden" asp-for="@Model.Id" />
                <input type="hidden" asp-for="@Model.UserName" />
    
                @foreach (var key in Model.RoleChecked.Keys)
                {
                    <div>
                        <label asp-for="RoleChecked[key]">@key</label>
                        <input type="checkbox" asp-for="RoleChecked[key]"/>
                    </div>
                }
                <input type="submit" value="Accept" />
            </form>
        </div>
    </div>


    public async Task<IActionResult> AddRole(Guid id, CancellationToken ct)
            {
                var user = await userMgr.FindByIdAsync(id.ToString());
    
                var model = new UserRolesViewModel();
    
                model.Id = id;
                model.UserName = user.UserName;
                model.RoleChecked = new Dictionary<string, bool>();
    
                foreach (var role in roleMgr.Roles)
                {
                    if (await userMgr.IsInRoleAsync(user, role.Name))
                    {
                        model.RoleChecked[role.Name] = true;
                    }
                    else
                    {
                        model.RoleChecked[role.Name] = false;
                    }
                }
    
                return await Task.Run(() => View(model), ct);
            }
    
            [HttpPost]
            public async Task<IActionResult> AddRole(UserRolesViewModel model, CancellationToken ct)
            {
                var user = await userMgr.FindByIdAsync(model.Id.ToString());
    
                if (ModelState.IsValid)
                {
                    var inroles = new List<string>();
                    var exroles = new List<string>();
    
                    foreach (var rc in model.RoleChecked)
                    {
                        if (rc.Value == false)
                            exroles.Add(rc.Key);
                        else
                            inroles.Add(rc.Key);
                    }
    
                    foreach (var role in exroles)
                    {
                        await userMgr.RemoveFromRoleAsync(user, role);
                    }
                    foreach (var role in inroles)
                    {
                        await userMgr.AddToRoleAsync(user, role);
                    }
    
                    return RedirectToAction(nameof(UsersController.User), nameof(UsersController).CutController(), new { area = "Admin", Id = user.Id });
                }
    
                return await Task.Run(() => View(model), ct);
            }


    public class UserRolesViewModel
        {
            [Required]
            [Display(Name = "Id")]
            public Guid Id { get; set; }
    
            [Required]
            [Display(Name = "User")]
            public string UserName { get; set; }
    
            [Required]
            [Display(Name = "Role")]
            public Dictionary<string, bool> RoleChecked { get; set; }
        }


    Поменял Модель теперь чисто модель а не коллекция передается, во вьюшке так и не понял в чем прикол решение нашел подобной задачи и вишенка на торте оказывается что в айдентити скопом добовлять не работает пришлось по одному добавлять\удалять.

    P.S. Обожаю ставить вопросы и отвечать на них самому 10/10 фич интеренета
    Ответ написан
    2 комментария
  • Почему fetch отдаёт 401 при JWT авторизации на сервер asp.net core web api?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Коротко при работе с лкоального хоста с доменом, который ограничивает CORS — настраиваете прокси (если ангуляр, есть из коробки возможность настроить), если реакт — погуглите как.

    Работает так:
    - запрос с фронта идет на прокс-сервер
    - прокси-сервер не делает запрос через браузер, а server2server
    - получает овтет и отдает фронту

    Например запрос на домен api.foo.com/users настраивается так, что запрос идет на localhost:3001/api/users, который под капотом проксирует весь запрос на api.foo.com/users
    Ответ написан
    2 комментария
  • Почему fetch отдаёт 401 при JWT авторизации на сервер asp.net core web api?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Если вкратце, что и почему работает:


    1. Настройка CORS. Для того, что бы настроить cors для React(Next)JS Application, нужно указывать адрес https и это важно, поскольку при запуске приложения React(Next)JS адрес начинается с http. Пример:
      // ...
      services.AddCors(options =>
      {
          options.AddPolicy("AllowTeachToolClient",
              builder =>
              {
                  builder.WithOrigins("http://localhost:3000", "https://localhost:3000");
                  builder.AllowAnyHeader();
                  builder.AllowAnyMethod();
              });
      });
      // ...



    2. При генерации Jwt токена, нужно использовать именно SymmetricSecurityKey. Это для тех, кто захочет аналогично как я попробовать использовать что-то типа RSA(2048)

      Я не говорю, что они не работают, просто для начала с этим могут быть проблемы с реализацией



    3. Самое главное это заголовки. Лично у меня проблема решилась при наличии следующих header'ов:
      • Get:
        'Accept': '*/*',
        'Host': 'http://localhost:3000',
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {token}'



      • Post:
        'Accept': '*/*',
        'Host': "http://localhost:3000",
        'Content-Type': 'application/json;'



        Понятно, что наличие заголовка
      Authorization зависит от того, куда кидаете запрос. Обычно используется, для доступа к [Authorize] контроллерам/эндпоинтам



    4. Настройка Cors (Нюанс, для тех, кто с таким может столкнуться). Код для регистрации политики Cors:
      services.AddCors(options =>
      {
          options.AddPolicy("AllowTeachToolClient",
              builder =>
              {
                  builder.WithOrigins("http://localhost:3000");
                  builder.AllowAnyHeader();
                  builder.AllowAnyMethod();
              });
      });


      И самое главное, что ниже эту же политику нужно подключить перед тем, как вы будете использовать app.UseAuthentication(); и app.UseAuthorization();. Вырезка с самого вопроса:

      var app = builder.Build();
      
      app.UseCors("AllowTeachToolClient");
      
      app.UseHttpsRedirection();
      
      app.UseAuthentication();
      app.UseAuthorization();
      
      app.MapControllers();
      
      app.Run();



    Ответ написан
    Комментировать
  • Где хранятся struct, реализующие interface?

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

    Если кастануть структуру к интерфейсу, то произойдёт боксинг, как и при касте к object.
    Ответ написан
    Комментировать
  • Как записать данные в .docx без Interop?

    NPOI и OpenXML Sdk
    Ответ написан
    Комментировать
  • Как разобраться в работе с сетью в c#?

    1. Например ты можешь перекладывать данные из буфера куда-то ещё. В List<byte> например.
    А лучше переработай свой протокол, чтобы в этом не было нужды (чтобы где-то в начале сообщения писалось, сколько места тебе нужно выделить)

    2. Посмотри в сторону System.IO.Pipelines - там уже решены практически все проблемы, с которыми можно столкнуться.

    3. Подумай над тем чтобы использовать уже готовый протокол типа того же http
    Ответ написан
    Комментировать
  • Как сократить путь текущей директории в терминале?

    https://ohmyposh.dev/ или https://starship.rs/ поставь и будет у тебя нужный результат.

    Ну и тему нужно выбрать соответствующую.
    Ответ написан
    1 комментарий
  • Как собрать проект с WebView2 в 1 exe файл?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Самый простой вариант: Enigma Virtual Box. Кроме того, если надо просто браузер, который показывает какой-то сайт, то есть еще такая замечательная штука, как NWJS.
    Ответ написан
    Комментировать
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

    Идеальное решение без лишних рассуждений

    Картинки - в S3, а перед S3 поставить CDN, чтобы сильно S3 не нагружать.
    В центральную базу данных на сервере - только идентификаторы картинок.

    Клиент (на WPF) будет обращаться к какому-то приложению, которое написано на ASP NET Core, а оно, в свою очередь, будет идти в центральную БД за всякой инфой.

    Опционально - клиент будет идти в CDN за картинками.
    Сами картинки потом пусть кэшируются в ФС, чтобы не нужно было идти за ними повторно.
    Данные о модах тоже можно кэшировать, но уже в sqlite - это полезно будет, пока нет интернета, или пока актуальный список модов загружается.



    Да, единственный хороший вариант хранить картинки в базе - это не хранить картинки в базе, а хранить лишь пути или идентификаторы картинок.

    Главный минус картинок в ФС - это то что они будут привязаны к одному серверу. Лучше хранить картинки в другой системе (S3 или CDN) и хранить в базе их идентификаторы, чтобы потом клиент мог сам их скачать, если это необходимо. Так раздача картинок не будет привязана к основному серверу.

    А клиент пусть их кэширует также у себя на диске.

    В будущем я хотел бы попробовать сделать так, чтобы база была на каком-то сервере, чтобы многие могли пользоваться приложением, но не думаю, что это будет нормально работать, да и вообще не красиво( Заранее спасибо.

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

    Ну и клиент на WPF не должен напрямую подключаться к MS SQL.
    MS SQL должен находится где-то на сервере и спрятан за каким-то другим web-сервером (который будет написан с использованием ASP NET Core например), который будет уже отвечать за всякую логику.
    Если тебе нужна локальная база данных на клиенте (для кэша например), то лучше использовать sqlite.
    Ответ написан
    2 комментария
  • Как правильно проверять и обновлять refresh jwt?

    petermzg
    @petermzg
    Самый лучший программист
    1. В Refresh токене уже есть нужная информация. И в ответ выдается новый Access Token
    2. В подписанном Access Token не получится подменить exp. Так что новый
    3. Откуда выходим? В Web client можно просто забыть Access Token. Но если у кого-то останется refresh token, то можно получить новый Access Token.
    Если хочется чтобы его нельзя было использовать после выхода, то в Access Token и Refresh token, добавляется RefId. И если RefID в заблокирован, то новый получить Access Token из Refresh будет нельзя.
    4. Каждый конект имеет свой Refresh token, так что не получите и там и там одинаковый
    Ответ написан
    5 комментариев
  • Разработка клиент-серверного приложения с локальным хостингом сервера, возможно ли взаимодействие с сервером без онлайн хостинга оного?

    @Shavadrius
    И все таки лучше делать сразу нормально: с БД, с АПИ, с клиентом.
    Вряд ли при необходимости обновить статус товара работник магазина побежит драться за планшет с посетителем.
    Можно даже без АПИ обойтись: напрямую к БД обращаться, в самой БД все менять. Да можно даже без БД - хранить все в файле, доступном по сети. Но то, что с клиента нужно выносить изменяемые данные - факт.
    Ответ написан
    Комментировать
  • Обязателен ли web-server (NGINX) для Actix Web?

    Eugene-Usachev
    @Eugene-Usachev
    Обязательным nginx не будет, но он рекомендован большинству веб-проектам. Очень многие проблемы на себя берёт nginx, и вообще странно брать высокопроизводительный инструмент (Actix Web) и не позаботься о балансировке нагрузки (или вы хотите сами писать балансировщик?).
    Ответ написан
    Комментировать
  • Передача сообщения через SignalR. Как сделать однократное соединение с сервером?

    Lapish72
    @Lapish72
    Нет примера вызова методов из вашего класса, но могу предположить, что вы каждый раз инициализируете его. Вам нужно сделать ваш класс Singleton'ом. Для этого в Startup ConfigureServices зарегистрируйте ваш сервис:
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<ВашСервис>();
        }
    }

    И затем в Program:
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            var service = host.Services.GetRequiredService<ВашСервис>();
            service.ConnectToServer(); //Подключаемся к SignalR
    
            host.Run();
        }
    }


    UPD:
    Советую поменять название класса на более общее, например, SignalrService, а метод SendToSignalR на Connect.
    Ответ написан
    6 комментариев
  • Стоит ли вообще искать интернет-ресурсы, где описано как "подружить" ASP.NET с MySQL?

    Используй Pomelo.EntityFrameworkCore.MySql

    информации насчёт того, как делать миграции в MySQL средствами Visual Studio

    Сейчас миграции делаются не средствами студии, а средствами efcore cli - в этом плане раскатка миграций никак не отличается от любой другой СУБД.

    и как, собственно настраивать проект под ASP.NET (options, builder, Swagger (не удивляйтесь, пока я именно его использую, т.к. при обкатке новой СУБД такой выбор очевиден) и прочее).

    Они ортогональны и никак не зависят от СУБД.

    PS: зачем тебе mysql, когда есть postgres?
    Ответ написан
    1 комментарий
  • Как хранить товары с различными опциями в БД?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Ответ на вопрос "как хранить" зависит от того, какие данные вы будете запрашивать. То есть - от представлений данных, с которыми работает ваша программа (программы). Именно на основе этих представлений синтезируется полная модель даннных, хранящаяся в БД.
    В свое время, лет 25 назад, был (может, и сейчас есть) стандартизированный подход, называвшийся IDEF1 (это имя из стандарта) или Entity-RelationShip (это название процедуры), позволявший формальным образом синтезировать из этих, частных, представлений полную модель данных. И были программы, которые позволяли это делать. Я одной такой пользовался, ERwin называлась (AFAIK она жива и сейчас), но, в принципе, нужные процедуры можно выполнять и вручную. Описание процедуры на русском есть, как минимум одно, которое я знаю - в старой книге "Мартин Дж. Организация баз данных в вычислительных..."
    Короче, синтез модели ваших данных - это ваша задача, связанная со специфическими вашими задачами.
    Судя по информации из вашего вопроса, я могу только сказать, что:
    1. этот вариант вам явно не походит: данные из представления "Товары в корзине" включают товары из всех категорий, так что отделные таблицы для каждой категории - это костыль: ходить можно, а бежать - уже нет.
    2. В ItemOptions можно хранить данные для всех категорий - достаточно указать в каждой записи дополнительно к идентификатору товара идентификатор категории и идентификатор свойства. Потребуются ещё таблица категорий (идентификатор категории как первичный ключ плюс дополнительная информаци) и таблица свойств для каждой из категорий (идентифкатор свойства как первичный ключ, идентификатор категории - внешний, плюс дополнительная информация). Схема получается не очень уклюжая, но для работы в рамках реляционной модели более-менее годная (я когда-то такую и делал и с ней работал, но это было жутко давно). Насколько для вас такая схема пригодна - зависит от ваших моделей предствалений: например, будете ли вы в Корзине указывать дополнительную информацию из ItemOptions.
    3. NoSQL - это название больше коммерческое, а не техничекое: оно включает много разных технологий хранения в БД, единственным общим признаком которых является, что они - не реляционные. Под эту задачу мне видится годным вариант навигационной БД (это где каждая запись содержит физические ссылки на связанные с ней записи): сетевая, например. В настоящее время такие БД иногда ещё проходят под псевдонимом "графовая". Но, опять же, смотрите на нужные вам представления, в данном случае - обращайте внимание на пути доступа к данным (эти самые ссылки): навигационные БД в этом плане не так гибки, как реляционные, и отсутствие нужных ссылок может заставить ходить по кривым путям и убить тем самым производительность.
    Но это все теория, а что там сейчас на практике творится - я с уверенностью сказать не могу. Насколько я понимаю, там надо смотреь возможности конкретной СУБД - тем более, что производители часто называют их словом "гибридная", и надо понимать, что в этот гибрид попадает.
    Ответ написан
    2 комментария
  • Как реализовать Postgresql Ecommerce?

    CodeNull
    @CodeNull
    Недавно обсуждалось: Как хранить товары с различными опциями в БД?
    • EAV паттерн - используется в 99% случаев, но может создать проблемы при большом объеме данных или неумелом использовании. Подробнее: https://habr.com/ru/companies/tensor/articles/657895/
    • Свои варианты завязанные на контекст решаемой задачи, придумать можно много чего.
    Ответ написан
    Комментировать