2012-02-06 53 views
1

我已经运行遇到一个行为与HttpWebRequest的,我相信是有意的,但我一直没能找到明确表示,这是正确的任何来源,我想我会发布它作为一个问题,看看有没有人遇到过这个问题,或者可以验证这是正确的。异步邮政与HttpWebRequest的在MVC3

对于初学者我在IIS 7.5上运行的应用程序MVC3。它有1个控制器并支持1个post方法。我在Windows中启用了Windows身份验证和ASP.NET模拟。 MVC3应用程序背后的想法就是拥有一个简单的服务,可用于从各种客户端应用程序(控制台应用程序,silverlight,asp.net,AJAX等)记录信息。服务所做的一件事是使用控制器的用户属性来记录谁将数据发布到此服务的人员。

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

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

当我发现这一点,我添加了邮寄到DOTNET的库的同步版本,发现日志服务,用我个人的凭据。

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

我一直没能找到是,如果这是明确的情况下,还是不行。如果任何人有答复或者或者能够指引我朝着正确方向的文章,我将不胜感激。

在此先感谢

+0

这看似和奇怪的问题,但什么样的网络浏览器您使用的? – CrazyCoderz 2012-02-07 04:23:26

+0

我使用IE 8.我已经想通了这个问题。 – MeyC 2012-02-07 13:50:47

回答

0

我是遇到了预期的行为。问题的根源归结到其下的身份服务于异步请求时就从.NET线程池中的线程执行。在我的情况下,线程正在作为应用程序池创建的应用程序域的所有者执行。在我的情况下,这是一个服务帐户。

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