Получение значение из сессии, если таковая имеется, если нет, берешь из базы данных


Этот метод представляет собой конструктор, который необходимо решить, какие URL-адреса, чтобы добавить в заголовок ответа, как разрешить-происхождения. я на самом деле добавив разрешить-происхождения позже по значению переменной PermittedOrigion. Я использую сессии для ликвидации доступа к базе данных.

Я мог бы написать его более эффективным? Я работаю с asp.net форму

public ResponseAsJson(HttpRequest request, int affiliateId)
    {
        string cacheKeyName = $"PermittedOrigion_{affiliateId.ToString()}";
        const string notDefined = "N";
        object ValueFromCache = HttpContext.Current.Cache[cacheKeyName];

        if (!String.IsNullOrWhiteSpace(ValueFromCache?.ToString()))
        {
            if (ValueFromCache.ToString() == notDefined)
                return;

            PermittedOrigion = ValueFromCache.ToString();
            return;
        }

        string actualOrigion = null;

        if (request.UrlReferrer != null)
           actualOrigion = request.UrlReferrer.GetLeftPart(UriPartial.Authority);

        string[] strFromDB = RM.BL.Affiliate.Instance(affiliateId).LUAffiliate.AccessControlAllowOriginJsonResult.Split(';');

        if (!String.IsNullOrWhiteSpace(actualOrigion) && strFromDB.Contains(actualOrigion))
        {
            PermittedOrigion = actualOrigion;
        }
        else 
        {
            string strLocalhost = strFromDB.Where(x => x.ToLower().StartsWith("http://localhost")).FirstOrDefault();

            if (!String.IsNullOrWhiteSpace(strLocalhost))
                PermittedOrigion = strLocalhost;
        }

        if (PermittedOrigion == null)
        {
            HttpContext.Current.Cache[cacheKeyName] = notDefined;
        }
        else
        {
            HttpContext.Current.Cache[cacheKeyName] = PermittedOrigion;
        }           


    }


159
1
задан 8 апреля 2018 в 08:04 Источник Поделиться
Комментарии
1 ответ

Некоторые рекомендации:

1) дать вашему методу лучше имя. ResponseAsJson не то, что он делает. Предложение: AppendAllowOriginHeader

2) Ваш метод опирается на affiliateId inputparameter. Я бы изменил параметр int? affiliateId а затем добавить короткий гвардии:

if(!affiliateId.HasValue) {
throw new ArgumentNullException(nameof(affiliateId));
}

Также имейте в виду, что идентификатор может быть недопустимым, в которой я предпочитаю, чтобы бросить InvalidArgumentException

3) Давайте приберемся: экстракт метода в две подфункции:TryAddFromCache(string key) и TryAddFromAllowedOrigins

TryAddFromCache может выглядеть так:

if(String.IsNullOrWhiteSpace(key)) {
return false;
}

...
return true;

И в AppendAllowOriginHeader:

if (TryAddFromCache()) {
return;
}

4) Как правило: использовать const или var везде, где это возможно.

5) экстракт второй способ:

bool TryAddFromAllowedOrigins(IEnumerable<string> allowedOrigins) { ... }

6) производительность: в этом случае мы имеем доступ к базе данных как "узкое место".
Вечеринка начнется в:

RM.BL.Affiliate.Instance(affiliateId).LUAffiliate.AccessControlAllowOriginJsonResult.Split(';');

.. который имеет наибольшее влияние.

Ваш массив strFromDB вероятно, не содержат ссылки на несколько тысяч строк. Поэтому фильтрация или сортировка (которая должна быть в любом случае работа с БД) не имеет никакого влияния.

 string strLocalhost = strFromDB.Where(x => x.ToLower().StartsWith("http://localhost")).FirstOrDefault();

можно изменить на:

strFromDB.FirstOrDefault(x => x.ToLower().StartsWith("..."));

7) рассмотреть возможность использования имен: например strFromDB может быть изменен на allowedOrigins

1
ответ дан 2 мая 2018 в 01:05 Источник Поделиться