HttpClient的认证头没有得到发(HttpClient authentication head

2019-06-23 12:08发布

我试图使用HttpClient对于需要基本的HTTP身份验证的第三方服务。 我现在用的是AuthenticationHeaderValue 。 这里是我想出迄今:

HttpRequestMessage<RequestType> request = 
    new HttpRequestMessage<RequestType>(
        new RequestType("third-party-vendor-action"),
        MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
        string.Format("{0}:{1}", "username", "password"))));

var task = client.PostAsync(Uri, request.Content);
ResponseType response = task.ContinueWith(
    t =>
    {
        return t.Result.Content.ReadAsAsync<ResponseType>();
    }).Unwrap().Result;

它看起来像POST操作工作正常,但我不回去我所期望的数据。 通过一些试验和错误,并最终使用招嗅出原始流量,我发现没有被发送的授权头。

我见过这个 ,但我想我已经得到了指定为一部分的认证方案AuthenticationHeaderValue构造。

是不是有什么我已经错过了?

Answer 1:

您的代码看起来像它应该工作 - 我记得运行到类似的问题设置授权头,然后通过执行Headers.Add(解决),而不是将它设置:

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));

更新:它看起来像当你做一个request.Content,并不是所有的标题被反映在内容对象。 您可以通过检查request.Headers VS request.Content.Headers看到这一点。 你可能想尝试的一件事是使用SendAsync而不是PostAsync。 例如:

HttpRequestMessage<RequestType> request = 
     new HttpRequestMessage<RequestType>(
         new RequestType("third-party-vendor-action"),
         MediaTypeHeaderValue.Parse("application/xml"));

request.Headers.Authorization = 
    new AuthenticationHeaderValue(
        "Basic", 
        Convert.ToBase64String(
            System.Text.ASCIIEncoding.ASCII.GetBytes(
                string.Format("{0}:{1}", "username", "password"))));

 request.Method = HttpMethod.Post;
 request.RequestUri = Uri;
 var task = client.SendAsync(request);

 ResponseType response = task.ContinueWith(
     t => 
         { return t.Result.Content.ReadAsAsync<ResponseType>(); })
         .Unwrap().Result;


Answer 2:

这也将工作,你就不必处理的base64字符串转换:

var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...


Answer 3:

尝试设置在客户端上的标题:

DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", userName, password))));

这对我的作品。



Answer 4:

其实你的问题是与PostAsync -你应该使用SendAsync 。 在你的代码- client.PostAsync(Uri, request.Content); 仅发送不包含在请求消息报头的内容。 正确的方法是:

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url)
{
    Content = content
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", credentials);
httpClient.SendAsync(message);


文章来源: HttpClient authentication header not getting sent