我有一个与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/");
Run Code Online (Sandbox Code Playgroud)
这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0).这不是我想要发生的事情.
如果我将上述代码更改为使用WebClient,则会正确传递用户的凭据:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Run Code Online (Sandbox Code Playgroud)
使用上述代码,服务将用户报告为向Web应用程序发出请求的用户.
我执行错误HttpClient导致它无法正确传递凭据(或者它是一个错误HttpClient),我做错了什么?
我想使用HttpClient它的原因是它有一个与s兼容的异步API Task,而WebClientasyc API需要用事件处理.
我想登录到一个Sharepoint门户,它会打开一个登录对话框但是正在使用NTLM身份验证.如何修改C#中的HTTP标头以成功登录请求?我假设我需要对门户网站登录部分中的页面进行HTTPWebRequest并发布HTTP头集合?
我正在尝试使用HttpClient访问需要NTLM身份验证的REST服务。但是我一直收到401未经授权。我的代码看起来像这样
private static void Main()
{
var uri = new Uri("http://localhost:15001");
var credentialsCache = new CredentialCache { { uri, "NTLM", CredentialCache.DefaultNetworkCredentials } };
var handler = new HttpClientHandler { Credentials = credentialsCache };
var httpClient = new HttpClient(handler) { BaseAddress = uri, Timeout = new TimeSpan(0, 0, 10) };
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = httpClient.GetAsync("api/MyMethod").Result;
}
Run Code Online (Sandbox Code Playgroud)
我的目标框架是netcoreapp2.0。如果我更改为net461,它将正常工作。不确定我在做什么错吗?