在HttpClient的多个重定向中传递授权标头

时间:2018-10-24 12:10:30

标签: c# httpclient system.net.httpwebrequest .net-4.7

我正在向服务器发送获取请求,服务器正在重定向到4进一步的调用,然后返回响应。 HttpClient给出异常,未提供授权令牌。

您能告诉我,如何在多个重定向中传递相同的授权令牌吗?如果我设置为“ AllowAutoRedirect = false”并返回RanToComplation状态,则效果很好。 这是我的方法:

static async Task CallWebAPIAsync()
        {

            WebRequestHandler webRequestHandler = new WebRequestHandler();
            webRequestHandler.UseDefaultCredentials = true;
             webRequestHandler.AllowPipelining = true;
            webRequestHandler.AllowAutoRedirect = true;

            using (var client = new HttpClient(webRequestHandler))
            {
                client.BaseAddress = new Uri("https://apirequest");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
                client.Timeout = TimeSpan.FromSeconds(30000);
                //GET Method  
                var response = await client.GetAsync("user").ConfigureAwait(false); 
                if (response.IsSuccessStatusCode)
                {
                    var responseresult = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Id:{0}\tName:{1}", responseresult);
                }
                else
                {
                    Console.WriteLine("Internal server Error");
                }

            }

2 个答案:

答案 0 :(得分:0)

我缺少委托处理程序,该处理程序将处理重定向。 https://stackoverflow.com/a/19493338/3459965 该链接对我有帮助

更新的代码为:

 static async Task CallWebAPIAsync()
    {
        HttpClientHandler clientHandler = new HttpClientHandler();
        WebRequestHandler webRequestHandler = new WebRequestHandler();
        webRequestHandler.UseDefaultCredentials = true;
         webRequestHandler.AllowPipelining = true;
        webRequestHandler.AllowAutoRedirect = false;
        webRequestHandler.Credentials = CredentialCache.DefaultCredentials;


        GlobalRedirectHandler globalRedirectHandler = new GlobalRedirectHandler() { InnerHandler = webRequestHandler };


        using (var client = new HttpClient(globalRedirectHandler))
        {
            client.BaseAddress = new Uri("https://apitest");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);


            client.Timeout = TimeSpan.FromSeconds(30000);
            //GET Method  
            var response = await client.GetAsync("user").ConfigureAwait(false); 
            if (response.IsSuccessStatusCode)
            {
                var responseresult = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Id:{0}\tName:{1}", responseresult);
            }
            else
            {
                Console.WriteLine("Internal server Error");
            }

        }
    }

答案 1 :(得分:0)

我认为问题可能与this

有关

在重定向中必须删除授权标头。我目前正在尝试找出解决方法。