在MVC3中使用HttpWebRequest进行异步发布

时间:2012-02-06 19:16:12

标签: asp.net-mvc-3 asynchronous httpwebrequest

我遇到了HttpWebRequest的行为我认为是有意的,但由于我无法找到明确说明这是正确的任何来源,我想我会把它作为一个问题发布,看看是否有人遇到了这个和/或可以验证这是正确的。

对于初学者,我在IIS 7.5上运行了一个MVC3应用程序。它有1个控制器,支持1个后置方法。我在IIS中启用了Windows Auth和ASP.NET Impersonation。 MVC3应用程序背后的想法只是提供一个简单的服务,可用于记录来自各种客户端应用程序(控制台应用程序,Silverlight,asp.net,AJAX等)的信息。该服务所做的一件事是使用来自控制器的User属性来记录向该服务发布数据的人员。

为了简化消费应用程序的处理,我创建了一些客户端库,Silverlight,DotNet和一个js库。

除非在另一个MVC3应用程序中使用DotNet库,否则这一切都按预期完成。对于DotNet库,我使用HttpWebRequest并使用异步方法(Begin / EndGetRequestStream)/(Begin / EndGetResponse)发布请求。我还在请求CredentialCache.DefaultCredentials上设置.Credentials,但是当日志记录应用程序开始处理来自另一个MVC3应用程序的请求时,它会将User显示为收到帖子的应用程序池的服务帐户。

当我发现这个时,我在DotNet库中添加了一个同步版本的帖子,发现日志服务正在使用我的个人凭据。

我认为HttpWebRequest可能使用不同的DefaultCredentials,具体取决于使用它的上下文。由于这是asp.net并且正在调用请求的异步方法,因此在客户端MVC3应用程序返回响应之前,我的库代码可能还没有完成。

我无法找到的是这是否确实如此。如果有人有回答或者文章可以指出我正确的方向,我会非常感激。

提前致谢

1 个答案:

答案 0 :(得分:0)

我遇到的是预期的行为。问题的根源归结为在为异步请求提供服务时,来自.Net线程池的线程执行的身份。在我的例子中,线程作为应用程序池创建的应用程序域的所有者执行。就我而言,它是一个服务帐户。

我能够在任何异步处理开始之前捕获模拟用户的身份,并使用WindowsImpersonationContext强制我的库代码作为模拟用户运行。通过执行此操作,CredentialsCache.DefaultCredentials在HttpWebRequest实例上设置时使用了我的凭据(模拟用户)而不是运行应用程序池的帐户。