Ответы пользователя по тегу ASP.NET
  • Как получить текст ответа ASP Net Core API?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Основным методом общения между клиентом и сервером являются Status Code. Зачем вам передавать точное описание, что там оно не нашло, если вы можете просто передавать 404 и клиент пусть сам генерирует себе ошибку.

    Вообще забудьте про этот бред return StatusCode. Есть нормальные методы StatusResult к которым относятся Ok(), BadRequest() и тот же NotFound(). В эти методы можете передавать какие-то мета-данные если вам нужно. Либо можете использовать Response.Headers. Но если вам прям очень-очень нужно впихнуть туда вот это вообще об ошибке, так что бы ваш сервер был на все руки мастер, можете сделать что-то типа такого:

    return NotFound(new { message = "Omg, Not Found!!!" });


    UPD:
    Как на клиенте через JS вытянуть ошибку? Я бы использовал просто ajax:

    $.ajax({
        url: '...',
        method: 'get',
        success: (response): {
            let data = JSON.parse(response.responseText);
            console.log(data.message); //Omg, Not Found!!!
        }
    });
    Ответ написан
    3 комментария
  • Как сделать редирект на refresh-token когда получаю AuthenticationFailed на asp.net core web api?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Решил. Как это всё делается? Внутрь onAuthenticationFailed вставляем этот код:
    if (context.Exception?.GetType() == typeof(SecurityTokenExpiredException))
    {
        IJwtService jwtService = context.HttpContext.RequestServices.GetService<IJwtService>();
    
        if (context.Request.Cookies.TryGetValue("refresh-token", out string refreshToken))
        {
            Result<ClaimsPrincipal> principalResult = jwtService.ValidateAndDecodeToken(refreshToken);
            if (!principalResult.IsSuccess || principalResult.Value == null)
            {
                return Task.CompletedTask;
            }
    
            Result<string> renewAccessTokenResult = jwtService.Encode(principalResult.Value);
            if (!renewAccessTokenResult.IsSuccess && renewAccessTokenResult.ValidationErrors.Any())
            {
                return Task.CompletedTask;
            }
    
            context.Response.Cookies.Append("access-token", renewAccessTokenResult.Value);
            context.Response.StatusCode = 200;
            context.HttpContext.User = principalResult.Value;
            context.Principal = principalResult.Value;
            context.Success();
        }
    }
    return Task.CompletedTask;


    Т.е.. вызывает сервис, берём refresh token и из него извлекаем ClaimPrincipal, далее на его основе делаем access token из того же сервиса и обрабатываем запрос, что бы он возвращал нужный статус. Как говорил Andrei SunnyPh , это допустимая практика (Спасибо)
    Ответ написан
    Комментировать
  • Как развернуть сайт на asp.net?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    1. Делаете паблиш проекта
    2. Выбираете целевую ОС
    3. Делаете коннект на сервер
    4. Заливаете туда то, что у вас получилось в результате Паблиша через FileZilla
    5. Настраиваете сервис .net приложения
    6. Настраиваете nginx, что бы сервер постоянно работал
    7. Запускаете сам сервис приложения
    Ответ написан
    2 комментария
  • Как управлять локализацией дат?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Вы можете использовать DatetimeOffset в связке с регистрацией локализации в Dependency Injection и Middleware
    Ответ написан
    Комментировать
  • Почему при навигации между компонентами в Blazor не погружается JS код?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    В blazor использовать кастомные JS скрипты немного сложнее чем вы думаете. Там нужно использовать такую штуку как JSRuntime. А вообще советую прочитать эту статью про JS Interop
    Ответ написан
    Комментировать
  • Как использовать аттрибут for для частичного предстваления asp.net core?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Да, только вам для этого нужно юзать эту конструкцию:

    @await Html.PartialAsync("_partialNameWithoutExtension", new ModelForPartialView())
    Ответ написан
  • Как получить доступ к wwwroot из другого проекта в web api?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Конкретно в моём проекте оказало, что папки wwwroot вообще не существовало. Под капотом метод вообще не отрабатывал
    Directory.CreateDirector(...)

    Папку создал вручную в корне проекта, всё заработало.
    Ответ написан
    Комментировать
  • Почему 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();



    Ответ написан
    Комментировать
  • Как передать массив FormData через ajax?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Методом тыка, спустя три дня перебора комбинаций методов нашёл один, который работает. Конечно, он меня не удовлетворил в силу способа отправки данных, но это, по крайней мере, работает

    let packagesForm = new FormData();
    for (let i = 0; i < packages.length; i++) {
        packagesForm.append(`vm[${i}].Image`, packages[i].Image);
        packagesForm.append(`vm[${i}].MeasureUnit`, packages[i].MeasureUnit);
        packagesForm.append(`vm[${i}].VolumeUnit`, packages[i].VolumeUnit);
        packagesForm.append(`vm[${i}].Volume`, packages[i].Volume);
        packagesForm.append(`vm[${i}].Price`, packages[i].Price);
        packagesForm.append(`vm[${i}].ProductId`, Number(response.id));
    }
    Ответ написан
    Комментировать
  • Как вывести изображение используя байтовый массив?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    src="data:image;base64,@System.Convert.ToBase64String(Model.User.Avatar)"
    Ответ написан
    Комментировать
  • Как изменить Collation(на кириллицу) в EF Core?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    EF Core по стандарту должен поддерживать кириллицу, по крайней мере, у меня с этим проблем не было. В чём у вас проблема именно?

    UPD:
    Вот пример куска БД старого проекта. БД создана на том же EF Core без дополнительных махинаций с языком
    639df57ae1369632626921.png
    Ответ написан
  • Как добавить поддержку кириллицы в post method Swagger?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Я так понял, вы отправляете json с клиента. Во первых, проверьте дебагом, как выглядит name перед отплавкой на сервер. Во вторых, проверьте дебагом, как выглядит name во время получения объекта на сервере. Третий этап - то, как name будет отправлено и сохранено в БД
    Ответ написан
    Комментировать
  • Можно ли используя синтаксис Razor получить значение атрибутов cshtml страницы?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Сделал по другому - через ajax, что бы не использовать Url.Action. Ниже привёл часть скрипта:

    buttons[i].onclick = () => {
            let buttonId = buttons[i].id.split('-')[1];
            let note = document.getElementById('note-' + buttonId).innerHTML;
            noteModal.innerHTML = note;
    
            $("#delete-note-btn").on('click', () => {
                let data = {
                    NoteId: buttonId,
                    ClientId: @Model.ClientId,
                };
    
                let jsonData = JSON.stringify(data);
    
                $.ajax({
                    url: '@Url.Action("Delete", "Note")',
                    method: 'post',
                    data: jsonData,
                    dataType: 'json',
                    contentType: 'application/json; charset=utf-8',
                    success: (response) => {
                        document.getElementById('modal-close-button').click();
                        setTimeout(() => {
                            location.reload();
                        }, 500);
                    },
                    error: (response) => {
                        // Autoredirect to error view
                    },
                });
            });
        }
    Ответ написан
    Комментировать
  • Как вывести список в представление по одному id?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Попробуйте юзнуть .Where при выборке, куда передать лямбду с логическим условием, что бы проверить каждый элемент по внешнему ключу, подходит он или нет
    Ответ написан
    Комментировать
  • Как выбрать нужный ClaimIdentity из ClaimPrincipal, если их несколько штук?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Разобрался

    При создании объект ClaimPrincipal, который принимает коллекцию объектов ClaimIdentity, все клаймы будут доступны в HttpContext. Когда вам нужно получить текущего пользователя и его клаймы используя HttpContext(Accessor), свойство User.Claims имеет все клаймы из всех объектов ClaimIdentity, который были использованы во время авторизации, по этому необязательно париться по поводу того, какой из объектов Identity вытянуть, а можно сделать выборку из всех клаймов
    Ответ написан
    Комментировать
  • Как ввести логгирование в ASP.NET Core?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Логирование используется для записи ошибок в како-то файл. Например, если вы, при чтении из БД получили Exception, тогда вы обращаетесь к логеру и вызываете метод .LogError куда передает ошибку в виде строки. Эта строка будет записана в файл, откуда вы потом сможете это прочитать.

    Встроенный интерфейс ILogger<> подойдёт вам вполне. Для настройки места, куда будут сохраняться логи, читайте конфигурацию логера, как его правильно настроить

    Да, логи пишутся вручную
    Ответ написан
  • Как сделать элемент установленным по стандарту если я использую Html.GetEnumSelectedList?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Разобрался. Просто нужно ещё передать какое-то значение моделью и установить его как asp-for=... и тогда оно будет отображаться как стандартное
    Ответ написан
    Комментировать
  • Почему ajax передаёт null?

    NikFaraday
    @NikFaraday Автор вопроса
    Student full-stack Developer
    Разобрался методом "Научного тыка"

    UPD: Проблема в том, что модель не может иметь типа enum. Вместо enum лучше поставить int и в сервисах преобразовать в этот тип. Если модель имеет enum и его значение хоть как-то пытается отправиться с фронта, сразу заходит null.
    Ответ написан
    Комментировать
  • Как отправить данные с помощью ajax в приложение на asp .net core?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Может немного запоздал с ответом, судя по дате вопроса, но может это поможет новым молодым разработчикам)

    1) Экшен (Метод контроллера с возвращаемым значение IActionResult) должен иметь атрибут IgnoryAntiforgetyToken ОБЯЗАТЕЛЬНО, если вы не генерируете его самостоятельно.
    2) ajax запрос должен передавать json данный, если вы указываете тип передачи данных json соответственно. Для этого, перед ajax запросом, пропишите что-то типа let jsonData = JSON.stringify("something").
    3) Самое главное, url нужно указывать вот так: '@Url.Action("ActionName", "ControllerName")'
    4) Методы success и error, если вы пишете там function(response), то вот этот response это локальная переменная, которая показывает сам ответ от сервера. Для получения каких-то данных от сервера, нужно прямо обращаться к той переменной, которую вы передаёте через Json, для примера, если возврат имеет вот такой вид

    return Json(new { message = "some message" } ):

    Тогда на ajax'е вы должны обращаться к этой message через переменную response, типа вот так:

    alert(response.message);
    Ответ написан
    Комментировать