我有一个 Web 应用程序(托管在 IIS 中)与 Windows 服务对话。Windows 服务使用 ASP.Net MVC Web API (自托管) ,因此可以使用 JSON 通过 http 进行通信。Web 应用程序被配置为执行模拟,其思想是向 Web 应用程序发出请求的用户应该是 Web 应用程序用于向服务发出请求的用户。结构如下:
(红色突出显示的用户是下面示例中提到的用户。)
Web 应用程序使用 HttpClient
向 Windows 服务发出请求:
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
的一个 bug) ?
我之所以要使用 HttpClient
,是因为它有一个与 Task
协作良好的异步 API,而 WebClient
的 asyc API 需要用事件来处理。