как сохранить учетные данные пользователя на сервере для выполнения запросов в фоновом режиме - PullRequest
2 голосов
/ 01 апреля 2011

Справочная информация:

У нас есть веб-приложение ASP.NET / Silveright.Клиент Silverlight отображает данные пользователя в графической форме - он запрашивает данные с сервера:

enter image description here

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

Идея оптимизации: Мы регулярно выполняем запросы к базе данных на сервере, записывая результаты в 'userdata'таблица в базе данных «близко к», где работает сервер ASP.NET.

Процесс выполнения запросов и записи данных в таблицы выполняется службой сбора данных, которая отделена от сервера ASP.NET.

enter image description here

Когда клиент запрашивает данные, сервер получает их из таблицы «userdata».Это должно быть хорошо и быстро - у нас, вероятно, есть таблицы 'userdata' на той же машине, что и сервер ASP.NET.У нас также есть дополнительное преимущество, что клиент видит данные, даже если основная база данных находится в автономном режиме.

Конечно, данные не являются живыми - но все данные потенциально устарели, как только они достигают клиента.

Итак, теперь моя проблема: службе «сбора данных» нужны учетные данные пользователя для выполнения этих запросов к базе данных (поскольку каждый пользователь получает разные результаты для одного и того же запроса).

Вопрос:

Как сохранить учетные данные пользователя в базе данных приемлемым «безопасным» способом?Таким образом, «сбор данных» может олицетворять пользователя для выполнения запросов к базе данных.Наш первоначальный сценарий основан на использовании интегрированного входа Windows в базу данных.

1 Ответ

1 голос
/ 01 апреля 2011

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

У меня есть идея, что вместо того, чтобы где-то хранить учетные данные, вы просто запускаете поток и предоставляете этому потоку текущие учетные данные, взятые из запроса.

class MyClass
{
    public static void DoSomething(object principal)
    {
        if (principal == null || !(principal is IPrincipal))
            throw new ArgumentException();
        Thread.CurrentPrincipal = (IPrincipal) principal;
        // Do heavy querying and update UserData
    }
}

Я вызываю это из контроллера ASP.NET MVC следующим образом:

public ActionResult Index() 
{
    var t = new Thread(MyClass.DoSomething);
    t.Start(User);

    return View();
}

Это обновит данные пользователя для каждого запроса.При желании вы можете ввести некоторую логику для частоты обновления и выполнять вызов только при определенных условиях.

Другим подходом, о котором я думал, был шаг к мышлению CQRS, где я в этом случае опубликовал бы сообщение, содержащее сериализованный IPrincipal, и это сообщение было бы использовано другим экземпляром / сервером, который обновитчитать модель как отдельный процесс.Но я не уверен, что IPrincipal будет действительно работать, если десериализовать на другом сервере.

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

...