Я звоню в веб-службу служб отчетов 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;
Я плохо понимаю, как работает кэш учетных данных, поэтому не могу понять, почему ему не нравится находиться в отдельном потоке.
Я попытался получить учетные данные во внешней функции и передать их в качестве аргумента, но возникает та же ошибка.
У кого-нибудь есть идеи, что может происходить?