我有一个与Windows服务对话的Web应用程序(托管在IIS中)。Windows服务使用的是ASP.Net MVC Web API(自托管),因此可以使用JSON与HTTP进行通信。Web应用程序被配置为进行模拟,其想法是向Web应用程序发出请求的用户应该是Web应用程序用于向服务发出请求的用户。结构如下:
(以红色突出显示的用户是以下示例中所指的用户。)
该Web应用程序使用以下命令向Windows服务发出请求HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0
)。这不是我想要发生的事情。
如果我更改上面的代码以使用 WebClient
,则正确传递了用户的凭据:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
使用上面的代码,服务将用户报告为向Web应用程序发出请求的用户。
我的HttpClient
实现有什么问题,导致它无法正确传递凭据(或者是的错误HttpClient
)?
我要使用的原因HttpClient
是它具有一个与s兼容的异步API Task
,而WebClient
的asyc API需要通过事件进行处理。
DownloadStringTaskAsync
在.NET 4.5,这也可以与异步/ AWAIT使用
HttpClient
没有SetCredentials()
方法。你能指出我的意思吗?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
在由Windows身份验证的用户访问的Web服务器上创建,然后该网站对另一个远程资源进行了身份验证(没有设置标志就无法进行身份验证)。