传递凭据适用于WebRequest,但不适用于HttpClient

时间:2018-04-17 15:22:03

标签: c# .net http dotnet-httpclient

我正在尝试使用HttpClient将凭据传递回Web服务。 但是,我一直收到一个未经授权的请求。 但是,当我尝试使用WebRequest时,它会进行身份验证吗?

的HttpClient:

        var handler = new NativeMessageHandler
        {
            UseDefaultCredentials = true,
            Credentials = credential
        };
        var client = new HttpClient(handler);
        var content = _httpClientHelper.Serialize(data);
        var response = await _client.PostAsync($"{_baseurl}/api/foos/List", content);

的WebRequest:

        HttpResponseMessage response = null;
        try
        {
            var data = JsonConvert.SerializeObject(new
            {
                ViewTitle = "New",
                PageCount = 60
            });

            var content = _httpClientHelper.Serialize(data);

            using (var client = new WebClient { UseDefaultCredentials = true, Credentials = credentials })
            {

                client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
                client.UploadData("$"{baseurl}/api/foos/List", "POST", Encoding.UTF8.GetBytes(content));
            }

我无法弄清楚为什么一个有效,另一个没有。 任何有关这方面的帮助或见解将不胜感激

1 个答案:

答案 0 :(得分:1)

如前所述herehere HttpClient的这种行为可能是因为HttpClientHandler的实现方式。

  

" [..] StartRequest方法在新线程中使用asp.net进程的凭据执行(而不是模拟用户的凭据)[..]"

您可能会看到HttpClient和WebClient的行为差异,因为

  

" HttpClient创建新线程   通过任务工厂。另一方面,WebClient同步运行   在同一个线程上,从而转发它   凭证(即模仿用户的凭证)。"