Использование SSRS Webservice внутри другого потока - PullRequest
0 голосов
/ 05 марта 2009

Я звоню в веб-службу служб отчетов SQL Server из приложения asp.net. Мне нужно отключить все подписки на данный отчет. Но я не хочу, чтобы пользователю приходилось ждать, пока все это произойдет, поэтому я хочу, чтобы все вызовы веб-службы находились в отдельном потоке и сразу возвращались к пользователю.

Я использую код, который выглядит примерно так:

public static void FireAllAsync(string ReportPath)
{
    Hashtable paramValues = new Hashtable();
    ThreadPool.QueueUserWorkItem(new WaitCallback(FireAll), ReportPath);
}

public static void FireAll(object ReportPath)
{

    ReportingService rs = new ReportingService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

    Subscription[] SubList = rs.ListSubscriptions((string)ReportPath, null);

    foreach (Subscription CurSub in SubList) {
        rs.FireEvent(CurSub.EventType, CurSub.SubscriptionID);
    }

}

Вызов FireAll работает нормально, но попытка вызвать FireAllAsync для использования потока завершается неудачно с ошибкой 401. Я считаю, что проблема с учетными данными не проходит должным образом. т.е. эта строка кода здесь:

rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

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

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

У кого-нибудь есть идеи, что может происходить?

1 Ответ

3 голосов
/ 05 марта 2009

Когда ваш основной поток выполняется, для него подготовлен контекст олицетворения. В сценарии с проверкой подлинности IIS проверил подлинность пользователя, а затем установил для этого пользователя токен потока, а не токен процесса.

Поскольку токен потока установлен для пользователя, этот поток может затем действовать от имени пользователя (на локальном блоке; для выполнения действий от имени пользователя на другом блоке необходимо установить делегирование если используется встроенная проверка подлинности Windows (NTLM / Kerberos).

Но если вы выделите рабочий поток без какой-либо идентификационной информации, этот рабочий поток будет создан без собственного токена, поэтому он будет использовать токен процесса.

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

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

Если нет, 401sville.

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

http://geekswithblogs.net/khanna/archive/2005/02/09/22441.aspx

http://aspalliance.com/articleViewer.aspx?aId=650&pId=2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...