C # Threading и Sql соединения - PullRequest
3 голосов
/ 07 апреля 2010

У меня есть метод, который пытается обновить базу данных сервера SQL в приложении ASP.NET. Если обновление завершается неудачно, оно перехватывает исключение, а затем помещает его в очередь в MSMQ, а затем запускает новый поток, который позже снимает очередь с ожидающего обновления и пытается снова. Когда поток запускается, ему не удается открыть соединение с базой данных, потому что он пытается подключиться с использованием сетевой службы в качестве имени входа. Соединение sql использует проверку подлинности Windows и будет работать вне потока. Если я вставлю точку останова в код, который выполняется внутри нового потока, и проверим Thread.CurrentPrincipal, он покажет Identity как правильного пользователя. Почему sql-соединение пытается открыть учетная запись сетевой службы?

Я могу уточнить дальше, необходимо.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 09 апреля 2010

Я обнаружил еще более элегантное решение, которое не требует изменений в файле aspnet.config.

// get the current WindowIdentity of the main thread
var currentIdentity = WindowsIdentity.GetCurrent();

Thread thread;
thread = new Thread(() =>
            {
                // using lambda closure, access the current identity
                // inside the background thread scope and call Impersonate
                var context = currentIdentity.Impersonate();

                // do multi-threaded stuff


                // undo the impersonation before leaving the thread
                context.Undo();
            })
        {
            Name = "BackgroundThread",
            IsBackground = true
        };
thread.Start();
3 голосов
/ 07 апреля 2010

Я понял это на основе этой темы: http://bytes.com/topic/asp-net/answers/597465-simple-thread-issue

Мне пришлось добавить это в начало блока кода потока:

((WindowsIdentity)Thread.CurrentPrincipal.Identity).Impersonate();
1 голос
/ 08 апреля 2010

По этой ссылке я нашел ответ: http://www.leastprivilege.com/WhatIsAspnetconfig.aspx

Вот ключевой бит информации:

<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="false" />
    <SymbolReadingPolicy enabled="1" />

    <legacyImpersonationPolicy enabled="false" />
    <alwaysFlowImpersonationPolicy enabled="true" />
  </runtime>
<configuration>
0 голосов
/ 07 апреля 2010

Я думаю, вам нужно проверить удостоверение пула приложений, под которым работает веб-сайт в IIS - установлен ли он в Network Service?

Кроме того, какой параметр олицетворения находится в вашем файле web.config?Проверьте, олицетворяете ли вы текущего пользователя, определенного пользователя или его нет (и поэтому используется идентификатор пула приложений).

Было бы полезно, если бы вы также опубликовали строку подключения.

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