Асинхронный пост с HttpWebRequest в MVC3 - PullRequest
1 голос
/ 06 февраля 2012

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

Для начала у меня есть приложение MVC3, работающее на IIS 7.5.Он имеет 1 контроллер и поддерживает 1 метод сообщения.У меня есть Windows Auth и ASP.NET Олицетворение включены в IIS.Идея приложения MVC3 заключается в том, чтобы иметь простой сервис, который можно использовать для регистрации информации из различных клиентских приложений (консольных приложений, silverlight, asp.net, AJAX и т. Д.).Служба использует свойство User из контроллера, чтобы также регистрировать, кто именно отправил данные в эту службу.

Чтобы упростить обработку приложений-потребителей, я создал несколько клиентских библиотек Silverlight,DotNet и библиотека js.

Все сработало, как и ожидалось, за исключением случаев использования библиотеки DotNet в другом приложении MVC3.Для библиотеки DotNet я использую HttpWebRequest и асинхронные методы (Begin / EndGetRequestStream) / (Begin / EndGetResponse) для отправки запроса.Я также устанавливаю .Credentials для запроса в CredentialCache.DefaultCredentials, но когда приложение ведения журнала начинает обработку запроса из другого приложения MVC3, оно отображает пользователя как учетную запись службы пула приложений, из которого было получено сообщение.

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

Я предполагаю, что HttpWebRequest может использовать разные DefaultCredentials в зависимости отв контексте, в котором он используется.Поскольку это asp.net и вызывается асинхронный метод запроса, мой библиотечный код, возможно, даже не завершился до того, как клиентское приложение MVC3 вернуло ответ.

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

Заранее спасибо

1 Ответ

0 голосов
/ 07 февраля 2012

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

Мне удалось захватить личность олицетворенного пользователя до начала любой асинхронной обработки и использовать WindowsImpersonationContext, чтобы заставить мой библиотечный код работать как олицетворенный пользователь.Делая это, CredentialsCache.DefaultCredentials использовал мои учетные данные (олицетворенный пользователь) вместо учетной записи, выполняющей пул приложений, при установке его в экземпляре HttpWebRequest.

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