【问题标题】:Asynchronous Post with HttpWebRequest in MVC3在 MVC3 中使用 HttpWebRequest 进行异步发布
【发布时间】:2012-02-06 19:16:12
【问题描述】:

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

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

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

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

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

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

我无法找到是否确实如此。如果有人有答案或文章可以为我指明正确的方向,我将不胜感激。

提前致谢

【问题讨论】:

  • 这可能看起来很奇怪,但是您使用的是什么网络浏览器?
  • 我使用的是 IE 8。我已经解决了问题。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多