Обработка сеанса внутри статического класса - PullRequest
0 голосов
/ 08 июня 2009

Я разделил все прямые сеансы взаимодействия в отдельный класс и сделал его статическим, потому что я не хотел создавать новый объект несколько раз. Тем не менее, я хочу убедиться, что нет проблем параллелизма или других неожиданных сюрпризов.

Вот код:

public static class HttpHelper
{

    public static string Get(string key)
    {
        object value = HttpContext.Current.Request.QueryString[key];
        return (value == null) ? null : value.ToString();
    }


    public static string Post(string key)
    {
        object value = HttpContext.Current.Request.Form[key];
        return (value == null) ? null : value.ToString();
    }

    public static string Session(string key)
    {
        object value = HttpContext.Current.Session[key];
        return (value == null) ? null : value.ToString();
    }

    public static void ClearSession(string key)
    {
        HttpContext.Current.Session[key] = null;
    }

    public static void StoreInSession(string key, object value)
    {
        HttpContext.Current.Session[key] = value;
    }

}

Ответы [ 4 ]

1 голос
/ 08 июня 2009

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

Как получить доступ к переменным сеанса из любого класса в ASP.NET?

1 голос
/ 08 июня 2009

Если бы были какие-то функциональные проблемы с этим, многие приложения давно бы потерпели неудачу:)

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

0 голосов
/ 08 июня 2009

Я не уверен, что эта обертка полезна, но я думаю, что вы могли бы сделать следующие улучшения Вместо

public static string Get(string key)
{
    object value = HttpContext.Current.Request.QueryString[key];
    return (value == null) ? null : value.ToString();
}

вы можете использовать

public static string Get(string key)
{
    return HttpContext.Current.Request.QueryString[key];
}

То же самое для метода Post. И правда ли, что ваш метод Session возвращает только строку, если вы можете сохранить любой объект в сеансе с помощью метода StoreInSession?

0 голосов
/ 08 июня 2009

Концептуально у вас все должно быть в порядке. Даже в сценарии частичной обратной передачи (EG, AJAX), где вы можете ожидать условия гонки, вы должны быть в порядке. Состояние сеанса использует блокировку чтения / записи для обеспечения вашей безопасности.

Я склонен делать что-то похожее в моих проектах, хотя я фанат инкапсуляции действительных записей сеансов (ключей и т. Д.) В свойствах. Я считаю, что это делает код приложения более согласованным и, что более важно, исключает возможность опечатки в строке магического ключа, которая заставит приложение вести себя совершенно неожиданно.

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

...