Ответы пользователя по тегу C#
  • Почему не работает проверка подписи в vk mini apps?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Ну короче тема не особо популярна, но решене все же выложу (сравнил что генерит node.js и нашел проблему).
    var signString = string.Join("&", signParams
                .OrderBy(x => x.Key)
                .Select(x => x.Key + "=" + WebUtility.UrlEncode(x.Value)));

    WebUtility.UrlEncode заменяет запятую на %2C, в то время как HttpUtility заменяет на %2c, что критично
    Ответ написан
    Комментировать
  • Неуловимая 400 ошибка как поймать?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    Какая модель отправляется? Что видно в инспекторе браузера на вкладке network? Headers, Payload, Preview
    На бекенде как написан контроллер, какие атрибуты, от какого класса наследуется?
    Как написан метод, интересуют параметры
    Ответ написан
    Комментировать
  • Можно ли подменить экземпляр сервиса в DI?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Я разобрался, регистрирую же по интерфейсу, доставать тоже нужно по интерфейсу и кастить
    var logger = _servicesProvider.GetRequiredService<ILogger<ConsumerHostedService<Entity>>() as FakeConsumerHostedServiceLogger;
    var msgs = logger.messages;
    Ответ написан
    Комментировать
  • Какой фреймворк для логирования использовать в WPF приложении?

    Jeer
    @Jeer
    уверенный пользователь
    Посмотри Microsoft.Extensions.Logging + Serilog + Kibana - эта связка вроде как должна на всех типах проектов хорошо лежать (я не знаком с wpf, но вроде как разницы не должно быть)
    Ответ написан
  • Как можно отрефакторить код?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Что-то никто так и не ответил. В общем, нам нужно сделать некий обобщенный интерфейс и под него подтянуть наши шаги, которые потом можно вынести отдельно. Получится что-то такое:
    using CartCalculator.Models;
    
    namespace CartCalculator;
    
    public class Calculator
    {
        private readonly Product[] _allMenuProducts;
        private readonly Promocode[] _allAvailablePromocodes;
        private readonly DeliveryZone[] _allDeliveryZones;
    
        public Calculator(Product[] allMenuProducts, Promocode[] allAvailablePromocodes, DeliveryZone[] allDeliveryZones)
        {
            _allMenuProducts = allMenuProducts;
            _allAvailablePromocodes = allAvailablePromocodes;
            _allDeliveryZones = allDeliveryZones;
        }
    
        public double CalculateTotalPrice(Cart cart)
        {
            double totalPrice = 0;
    
            ICalculationStep[] steps =
            {
                new ProductsSumStep(_allMenuProducts),
                new PromoCodeStep(_allAvailablePromocodes),
                new DeliveryFeeStep(_allDeliveryZones),
            };
    
            foreach (var step in steps)
            {
                totalPrice = step.Calculate(cart, totalPrice);
            }
    
            return totalPrice;
        }
    }
    Ответ написан
    Комментировать
  • Как правильно подключить метрики c#?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    В общем, как обычно тупка какая-то, мне не нужно было выносить в отдельное поле, достаточно было зарегистрировать в конструкторе (стыдно за такие вопросы, но удалять не буду, что поделать)
    using System.Diagnostics.Metrics;
    
    namespace MyProject.Outbox;
    
    public class OutboxMetrics
    {
        private readonly IOutboxRepository _repository;
        public static readonly Meter OutboxMeter = new("Outbox");
        public readonly Counter<int> OutboxPublishCounter = OutboxMeter.CreateCounter<int>("outbox-publish");
    
        public OutboxMetrics(IOutboxRepository repository)
        {
            _repository = repository;
    
            OutboxMeter.CreateObservableGauge<long>("outbox-count", () => GetOutboxLength);
        }
    
        private long GetOutboxLength => _repository.GetLength().GetAwaiter().GetResult();
    }
    Ответ написан
    Комментировать
  • В чем может быть причина, что не работает аутентификация через Cookies в asp.net?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    На вид подключено правильно.
    Оставьте app.UseAuthorization(); и добавьте обычный метод рядом с фильтром [Authorization]
    Если он работает, то это дает гарантии, что подключено правильно )
    Попробуйте переставить блоки UseAuthentication и UseAuthorization поставить до или после UseStaticFiles, порядок может играть роль
    Ответ написан
    1 комментарий
  • Как дебажить JavaScript Visual Studio 2022?

    Jeer
    @Jeer
    уверенный пользователь
    Кто пробовал пользоваться отладчиком js в студии часто хапали проблемы. Я при установке студии сразу выключаю связь с браузером, это сделано коряво и неудобно.
    Все веб разработчики пользуются средствами разработчика хрома.
    если нужна точка останова, можно написать в js слово debugger и там остановится само, не нужно будет искать место
    в консоли можно получать(смотреть) и изменять значение переменных, это бывает удобно
    ну и третья полезная вкладка network, там можно смотреть, какие именно запросы и какие в них данные уходят/приходят
    Этого достаточно и удобно пользоваться
    Ответ написан
    Комментировать
  • Что учить для полного понимания ASP.NET CORE?

    Jeer
    @Jeer
    уверенный пользователь
    Привет, напиши почту, скину level assesment, там видно, что и как нужно знать и сможешь вести свой прогресс
    Ответ написан
    6 комментариев
  • Как переопределить встроенную валидацию в конвейер обработки запроса .net core?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Нашел самостоятельно ответ,
    Речь идёт про автоматический ответ, если в запросе невалидная модель https://docs.microsoft.com/en-us/aspnet/core/web-a...
    И там же ниже показано, как убрать этот обработчик:
    https://docs.microsoft.com/en-us/aspnet/core/web-a...
    builder.Services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true; // вот это
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
                "https://httpstatuses.com/404";
        });
    Ответ написан
    Комментировать
  • Как классу Program задать модификатор public в c# 9.0?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Подсказали, я переписал класс Program в олдовом формате:
    namespace Api
    {
        public class Program
        {
            static void Main(string[] args)
            {

    И это завелось, хотя мне было как-то неочевидно, что так можно сделать.
    Всем спасибо!

    UPD
    Ещё подсказали, что можно в новом синтаксисе можно в самом низу написать через partial и это так же будет работать:
    using...
    ... 
    app.Run();
    
    public partial class Program { /* Expose the Program class for use with WebApplicationFactory<T> */ }
    Ответ написан
    Комментировать
  • Как правильно писать на c# классы-обертки над коллекциями, чтобы доступ к коллекции был по имени класса?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Нашел, этот раздел называется "индексаторы" метанит
    Ответ написан
    Комментировать
  • Почему так работает decimal.Parse?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    В общем, я наткнулся на подобные ошибки при считывании данных. Удивлён, что вообще существует такая бредовая ситуация.
    Решилось тем, что я поменял в базе тип поля на money, в entity оно сгенерировалось как decimal(19,4) и ошибка ушла
    Ответ написан
    Комментировать
  • Как правильно интегрировать несколько систем в компании?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    Проблема существует практически на всех предприятиях, но обычно это разные системы, типа 1с на кадры, самописная c# по документам и какая-нибудь готовая опен-сорц система поддержки на php. Ваш вариант, что всё написано на одной технологии благо, используйте это, заворачивайте в нугет библиотеки.
    Про esb - все очереди используются для синхронизации данных. То есть, у вас изменился некий сотрудник в кадрах, сохраняется не напрямую в бд, а через очередь. Другие системы так же подписаны на эту очередь и обновление сущности сотрудника идёт во всех системах, которые хранят дубли необходимых им данных. Как вы понимаете, тут куча накладных расходов и нештатных ситуаций. За этим нужно следить и как-то восстанавливать/докачивать данные. Тем не менее, это самый правильный вариант, ибо в противном случае синхронизацию данных делают кастылями через вьюхи/джобы/хранимки и как только отвратительно не делают. В общем, если хватает скиллов - делайте так, будут независимые рабочие приложения.
    По общению через апи - там нет проблем с какими-то маленькими и атомарными операциями. Проблемы начинаются когда необходимы _распределённые транзакции_ погуглите про это, как реализовывают и оцените насколько тяжелее будет разработка. Вторая тут проблема - это отчёты, тупо джоины. Вам нужно выгрузить какую-то консолидированную инфу из одной системы, вы делаете, но в ней у вас только айдишники пользователей. Либо вы эти айдишники отправляете в сервис кадров и получаете развёрную инфу по каждому, либо на каждый такой запрос вообще грузите полный список пользователей. А потом ещё говорят, нужно исключить данные по пользователям на время их отсутствия. Опять же эти данные в сервисе кадров и, в общем, нужно лепить какой-то большой снежный ком не из снега. Окей, если прям вопрос с отчётами, можно будет заводить какие-то консолидированные хранилища и все системы будут туда сливать данные, но вот при обычном использовании вам всё равно потребуется делать большие джоины, какие с этим косяки я примерно описал.
    По варианту общих сервисов, я за него из-за простоты:
    Хранить строки подключений нужно в каждом проекте - это не проблема
    Дублировать бизнес-логику не нужно, выносите её так же в общие сервисы
    Обновлять будет нужно оба сервера, если в общем сервисе баг. Тут разговор, очевидно, про "баг на проде" - из-за общего кода будет баг на обоих продакшенах. Окей, как часто у вас возникают такие ситуации и насколько долго обновить два прода вместо одного?
    Ответ написан
    1 комментарий
  • ADO.Net почему не выходит подключение?

    Jeer
    @Jeer
    уверенный пользователь
    Каким образом вы работаете с базой и что за база вообще, ms sql?
    Если через sql management studio вы создаёте таблицы, каким образом вы подключаетесь к базе?
    Попробуйте подключиться к этому серверу (localdb)\mssqllocaldb с виндовым логином и паролем. Если подойдёт, то используйте его и в строке подключения
    Подключение через DataSource было ранее в .net framework через веб конфиг. Я не разбирался с этим особо, возможно, они равнозначны. В .net core строки подключения пишутся в appsettings.json примерно так:
    "ConnectionStrings": {
    "AppConnection": "Server=(localdb)\\mssqllocaldb;Database=game;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
    Тут используется виндовый логин/пароль. Если вы создали своего пользователя, то вместо Trusted_Connection=True; вбиваете User ID=root;Password=root;
    Дополнительный вопрос, зачем вам вообще ado.net, когда есть entity framework?
    Ответ написан
    Комментировать
  • Как можно улучшить этот код(ревью)?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    Насчёт архитектуры сложно, посмотрите паттерны, рекомендую сайт https://refactoring.guru/ru.
    Дублированного кода не должно быть. Вынести можно несколькими способами, после ознакомления с паттернами, подберёте наиболее вам подходящий.
    Магические текстовки - плохая практика. Замените хотя бы на константы, но лучше работайте с энумами.
    Насчёт code style так же верно заметили. У вас один метод именуется с большой буквы, в другом классе метод с маленькой буквы - это бросается в глаза и оставляет отпечаток, что сделано "тяп-ляп", лабораторная работа номер два.
    Есть спецификации языка, в которых описывается, как правильно внедрять новые фишки. На основе этого (или через боль поиска багов) внутри компаний формируются свои code style документы. Могу скинуть вам на почту свой документ, это очень полезная вещь
    Ответ написан
    6 комментариев
  • Как справиться с данной проблемой?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    Говорю на шару, так как не вижу проекта и данных не хватает
    Скорее всего нужно в нугет пакетах добавить Microsoft.EntityFrameworkCore.SqlServer помимо уже подключённого Microsoft.EntityFrameworkCore.
    В startup.cs так же должен быть UseSqlServer, если вы работаете с базой MS SQL
    Ответ написан
    Комментировать
  • Как вернуть string из дженерика c#?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Какой же я молодец, гуглится быстрее, чем писал вопрос:
    if (typeof(T) == typeof(string))
    {
        return (T)(object)content;
    }
    Ответ написан
    Комментировать
  • C# DataRow Select поиск по выражению с одинарной кавычкой, реально?

    Jeer
    @Jeer
    уверенный пользователь
    Привет,
    В SQL кавычка экранируется кавычкой

    zapros += " NAME LIKE '%''%'";
    Ответ написан
    Комментировать
  • Как починить авторизацию .net core после миграции на 3.1?

    Jeer
    @Jeer Автор вопроса
    уверенный пользователь
    Добрый день,
    Отпишусь как решилось: в инструментариях гугл хрома на том запросе, где происходит аутентификация, на заголовке Set-Cookie висел жёлтый треугольник с восклицательным знаком. А если навести курсор, то была и подсказка "this set-cookie was blocked..." дальше я не запомнил, прогуглил фразу и оказалось, что надо было зайти в гугловских дев тулсах на вкладку Application и нажать на Clear site data.
    То есть, код у меня рабочий и на другом компе отработал бы, так получилось вследствие того, что я был авторизован на локалхосте с предыдущей версии .net core, и из-за того, что произошёл переход на новую версию, хром не смог чего-то там перезаписать и куки просто не устанавливались. При этом в разделе Cookies было пусто, быть может вручную ранее чистил, не помню.
    В общем, вот такое колдунство. Большое спассибо Василию Банникову
    Ответ написан
    1 комментарий