• Можно ли организовать международный прием платежей для интернет магазина с помощью платежных шлюзов?

    Как один из вариантов интегрировать криптопроцессинг, по типу CryptoCloud, сможете принимать международные платежи, и выводить USDT и делать моментальный вывод, но есть загвоздка. Клиентам тоже придется оплачивать в криптовалюте. Тема с фиатом не будет работать. Как вариант в целом можно рассмотреть как дополнительный способ приема платжей в свой магазин, по сути вариант остается рабочим, но не во всех нишах таким популярным.
    Ответ написан
    Комментировать
  • Какой принцип безопасности при создании ссылки на оплату?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Получается цену мне передавать не надо, а только список продуктов
    Именно. С фронта должны приходить id товаров и количество. Окончательный расчёт цены выполняет бэк. Он же формирует чек и отсылает его в платёжную систему, перебрасывая клиента на переданную страницу оплаты. И в бэк же возвращается callback от платёжной системы с подтверждением транзакции.
    Ответ написан
    Комментировать
  • Картинки и файлы для проекта?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В настройках проекта есть возможность указать файл как ресурс. Он будет копировать в выходную папку.

    В райдере это в свойствах файла задается: 657fe6fb3033c854326217.png

    P.S. параметр Copy to output directory
    Ответ написан
    5 комментариев
  • Как на c# организовать обмен сообщениями между сервером и клиентом, если нет белого айпи?

    impvision
    @impvision
    Сетевой админ
    Использую это проект - https://www.softether.org/

    Разработка Японского Университета города Цукуба.

    Если даже нет внешнего адреса, всегда 100% работает DNS имя внутренней сети самого сервиса - очень удобно.

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

    @nameus3r
    Попробуйте https://merchant001.cash/

    У меня подключен IGaming проект, оборот до 200 тыс/сутки. Мне дали по прием Рубля - 5.5%, вывод без комиссии.
    Ответ написан
    Комментировать
  • Почему net core потребляет много оперативной памяти?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    1. https://www.linuxatemyram.com/
    2. Особенности замера.

    Ну и 3:
    Даже если действительно на винде эта программа жрёт 11мб, а в докер-контейнере 200мб. Что это тебе даёт?
    Винда всё ещё будет отжирать минимум гиг, а линуксовое ядро будет болтаться около 100мб. И не забывай про п1 и 2
    Ответ написан
  • Есть ли консоль управления сайтами ASP.NET Core для Линукс'а?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    вообще нет, но можно попробовать упороться в автоматизацию:
    Вариант раз:
    Написать соответствующие скрипты для ansible.

    Вариант два:
    Контейнеризироваться и использовать кубер или хотябы голый докер.

    Вариант три, о котором я немного забыл:
    Octopus Deploy - ни разу не пользовался, но многие хвалят.

    Даже на винде трогать IIS Manager руками - не кошерно.
    Ответ написан
    4 комментария
  • Есть ли смысл завершать задачи генерируя ошибку(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?

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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    NPOI и OpenXML Sdk
    Ответ написан
    Комментировать
  • Как разобраться в работе с сетью в c#?

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

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

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

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    https://ohmyposh.dev/ или https://starship.rs/ поставь и будет у тебя нужный результат.

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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Идеальное решение без лишних рассуждений

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

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

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



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

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

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

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

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

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