• Где применяют ASP.net сегодня?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Мне интересно в какой сфере применяют ASP

    ASP - умер, да здравствует ASP.NET! А нет, да здравствует ASP.NET Core! ;-)

    1. Любые проекты. Как правильно большие и сложные. Делать что-то простое смысла нет, для этого можно использовать что-нибудь типа PHP.

    2. Работа есть. Но новичкам нынче придется не сладко. За последние семь лет все сильно усложнилось.

    3. Можно делать все :-) Блоги, формы, порталы, магазины, платежные сервисы, корпоративные сайты. В общем, все что угодно. Мои нынешние проекты являются сложными системами, которые я уже не способен охватывать целиком и они не ограничиваются использованием ASP.NET. Но .NET доминирует, поскольку это удобно и работать просто приятно, от процесса написания кода, до отладки и тестирования.
    Ответ написан
    Комментировать
  • Какова правильная последовательность вызова методов Web Api?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Маркер доступа (access token) вдается один раз. На стороне клиента сохраняется в sessiongStorage либо в cookies. Используется при каждом запросе к API. Как правило, передавать маркер доступа лучше через заголовки. При использовании HTTPS заголовки будут зашифрованы.

    Для повышения безопасности, сервер может выдавать маркер доступа привязанный к конкретному IP (можно еще усложнить, например проверять браузер, тип системы и т.п.). Если адрес клиента не совпадает с адресом в базе, то аннулировать маркер доступа и предлагать клиенту получить новый маркер доступа.

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

    На стороне сервера, для проверки доступа можно сделать отдельный фильтр, примерно как показано в коде ниже:

    class ApiAccess : AuthorizeAttribute
    {
    
      public override void OnAuthorization(HttpActionContext actionContext)
      {
        if (actionContext == null)
        {
          throw new ArgumentNullException("actionContext");
        }
    
        if (!this.IsAuthorized(actionContext))
        {
          return;
        }
      }
    
      protected override bool IsAuthorized(HttpActionContext actionContext)
      {
        bool isAuthroized = base.IsAuthorized(actionContext);
    
        // логика проверки доступа
    
        IEnumerable<string> authItems;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out authItems))
        {
          var auth = authItems.First().Split(' ');
          var token = service.GetToken(auth.Last());
          // ...
        }
    
        return isAuthroized;
      }
    }

    Фильтр добавляется к контроллерам WebAPI, где необходима проверка доступа:

    [ApiAccess]
    public class FileServerController : ApiController
    {
    
       // ...
    
    }

    Со стороны клиента, проще сделать вспомогательный метод, который будет отправлять запросы в API с использованием маркера доступа, а также проверять необходимость получения нового маркера доступа (если сервер вернет ошибку). Примерно, как показано в следующем коде:

    let url = '/методAPI';
    let data = {}; // параметры запроса
    let headers = {
      'Authorization': 'ANYNAMEHERE ' + sessionStorage.getItem('token')
    };
    
    $.ajax({
      cache: false,
      processData: false,
      type: 'POST',
      url: url,
      contentType: 'application/json',
      dataType: 'json',
      data: JSON.stringify(data),
      headers: headers,
      success: (result) => {
        // успех
      },
      error: (x, textStatus, errorThrown) => {
         // ошибка
    
         // на сервер можно сделать исключение для плохих маркеров доступа
         // и проверить, если responseText содержит данный тип исключения,
         // то требовать у пользователя повторную авторизацию
        if (x.responseText) {
           let exception = JSON.parse(x.responseText);
           // AccessDeniedException - тип исключения в WebAPI, 
           // (скорее всего полное имя типа придется указывать)
           if (exception.ExceptionType == 'AccessDeniedException') { 
              // ...
           }
        }
      }
    });

    Что касается получения пользователем маркера доступа, то это можно сделать любым удобным способом. Например, показывать модальное окно для ввода логина и пароля, или перенаправлять на отдельную страницу.

    Если API используется через отдельный (независимый от API) сайт, который авторизует пользователей, то пользователя можно не привлекать к процедуре получения нового маркера доступа, сайт это может сделать сам и передать новый маркер своему пользователю.

    Если API используется в браузере, как есть, то маркер доступа можно передавать в параметрах запроса. Однако это небезопасно, т.к. данные будут в открытом виде.
    Ответ написан
    6 комментариев
  • Как подружить mvc и web api в одном проекте?

    yarosroman
    @yarosroman
    C# the best
    Создаете новый проект ASP.Net, выбираете шаблон SPA, указываете индивидуальные учетные записи и там автоматом вам и MVC и WebAPI и Bearer token авторизация будет.
    Ответ написан
    2 комментария
  • Действительно ли новая asp.net core 1.0 быстрее в 8 раз Node.js?

    Jump
    @Jump
    Системный администратор со стажем.
    Правда ли, что новый Mercedes-AMG GT ездит в 8 раз быстрее Камаза?
    Конечно правда. По асфальту в легкую.
    Ну конечно если асфальт хороший, а не гравийка ухабистая.
    К тому же злые языки утверждают что Mercedes-AMG GT вообще не ездит. Реально пробовали - насыпали в салон 20тонн гравия, а он собака ехать не хочет.
    Ответ написан
    1 комментарий
  • Зачем нужен ContentProvider в единичном проекте?

    gadfi
    @gadfi
    https://gamega.org
    Вы ищите уникальное решение, на все случае жизни. Но так не всегда бывает, каждая задача требует свои решения.

    +1

    Но тогда ведь я не смогу использовать CursorLoader c CursorAdapter. Или я ошибаюсь?

    да, если поле не _id то недоступен целый ряд родных фич из sdk даже по нажатию на элемент списка вы не получите его ключ (из коробки если пк _id то при клике на элемент списка вы получите его _id)

    _id по сути уже стандарт для android, поэтому кроме случаев где по каким то очень важным причинам вам нужно назвать пк как то иначе, я бы рекомендовал все же называть пк _id

    Например сделать что то типа репозитория, но только без провайдера

    Конечно можно, но тогда целый ряд фич придется пилить самому

    мне нравится ContentProvider за его простоту, но не нравится за кривое api (нет, правда, метод в котором почти все параметры частенько null в 2016 году это через чур) но его api компенсируется его стабильностью
    еще раз опишу кейс его использования когда не нужно давать куда то доступ

    Клиент сферического интернет магазина
    для наглядности представим что у нас планшет и что экран разделен на 2 фрагмента
    первый фрагмент лента товаров
    второй корзина
    (да странный ux но что поделать .... )

    в ленте пользователь жмет на кнопку добавить в корзину, при этом волшебным образом обновляется ui во втором фрагменте при этом никакой сложной логики реализовывать для этого не нужно

    думаю такого же эффекта можно добиться при использовании rxjava но придется попотеть
    Ответ написан
    2 комментария
  • Зачем нужен ContentProvider в единичном проекте?

    @Archusha
    https://agaltsovav.ru/
    да все в целом зависит от задачи. И привычки.

    Зависит от многих вещей начиная от требования и заканчивая будет ли этот код поддерживаться.

    Вы можете и сделать репозиторий с прямыми SQL запросами или используя курсор. От проекта зависит.

    Вы ищите уникальное решение, на все случае жизни. Но так не всегда бывает, каждая задача требует свои решения.

    Возможно конкретно в вашем случае использование контент провайдера, тоже самое что для двух страничного сайта визитки ставить битрикс.
    Ответ написан
    3 комментария
  • Какова структура Android приложения при работе с БД?

    gadfi
    @gadfi
    https://gamega.org
    Какова структура современных приложений(имеется ввиду при использовании новых инструментов и фрэймворков разработки)?

    Единого мнения нет, аналога ларавела или джанго нет, но инструменты о которых нужно знать и иметь представление:
    Dagger 2
    MVVM
    MVP
    Data Binding

    Часто встречается утверждение что необходимо реализовывать все через фрагменты - так ли это?

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

    Что касается конкретно бд - лично я в этом плане старамоден, мне нравится надежность и удобство ContentProvider (удобство работы, втом плане что сделал и забыл, api у него отвратный) но время идет начинаю посматривать на rx для тех же задач
    Ответ написан
    6 комментариев
  • Оправдано ли использование Caliburn.Micro?

    alex1t
    @alex1t
    .net developer
    1. По сути - да. Это его главная "фича".
    2. Да, теряется, но не значительно. Не помню, где-то попадались бенчмарки.
    3. С этим не могу ничего сказать. Не помню.

    Можете посмотреть вот это недавнее сравнение: sonyks2007.blogspot.ru/2015/04/most-popular-mvvm-f...

    P.S. Лично мне больше MVVM Light понравился. Хотя в Caliburn.Micro есть корутины.
    Ответ написан
    3 комментария
  • Что лучше использовать для работы с базами данных в WPF?

    @MonkAlex
    C#, SQL, Delphi, C++ etc
    WPF и базы данных не имеют ни единой точки пересечения.
    Так что вы можете использовать абсолютно любой способ хранения данных, хоть вручную делая sql запросы, хоть используя EF\NHibernate.

    По поводу хибера могу сказать - изменения вполне легко поддерживаются, в полуавтоматическом режиме можно добавлять \ удалять столбцы и таблицы.
    Ответ написан
    Комментировать
  • Что нужно сделать, чтобы Navigation Drawer (боковое меню) показывалось на всех activity моего приложения?

    @Eserchik
    Android 2.0 - Activity
    Android 4.0 - Фрагменты
    В настоящее время использование новых Activity на каждое действие создает образ морально устаревшей программы.
    Щас должно быть так: одно приложение - одно activity, а внутри фрагменты и диалоги
    Я предлагаю вам попытаться описать функционал вашего приложения с использованием фрагментов и диалогов.
    Ответ написан
    Комментировать
  • Как правильно разбить приложение на Activity и Fragment?

    @StanKo
    Вообще тут по собственному усмотрению надо делать.
    Можно делать фрагменты со стеком, но ведь боковое меню-то останется при этом доступно и юзер сможет туда зайти и логика аппа поломается, т.е. не забыть отключить боковое меню. Однако при системе фрагментов в стеке есть проблема сохранения этого стека при уходе на фон и возврате (запустил календарь, нажал Home типа случайно или тебе как раз в этот момент внезапно позвонили, вернулся в апп - грабли) или при смене ориентации девайса с портрета на альбом (повернул девайс - грабли), потому что в стеке остается только последний фрагмент в таких случаях.
    Соответственно хочется перейти к активити и в данном случае лучше запускать активити на результат (startActivityForResult). Соотв. бокового меню не будет вообще, а стек будет нормально сохраняться. Но вот незадача - фрагмент не имеет метода onActivityResult(), он есть у фрагмент-родительской активити, т.е. придется сооружать Вам тут костыли недюжинные чтобы из активити этот результат передать во фрагмент. Ну, гугл на эту тему подскажет.
    Ну, или делать как Вы сами и предлагаете - путем именно замещения фрагментов, 1 фрагмент на стеке сохраняется. Но опять же - как транспортировать целевые данные будете в итоге? Через SharedPreferences? Через БД? А как будете знать что это актуальные данные, а не с прошлого выбора остались?
    Ответ написан
    Комментировать
  • Как сделать Navigation Drawer доступным на всех экранах приложения?

    @Copperfield
    Android dude
    Почему бы не сделать базовое активити с методом инициализации меню, и все остальные активити наследовать от базового?
    Загуглите slide menu on all activities android
    Ответ написан
    2 комментария