具体问题是下面这行代码(以下)
content.Headers.Add("Authorization", $"Basic {base64EncodedAuthenticationString}")
这种方法失败是因为HttpContent.Headers
(System.Net.Http.Headers.HttpContentHeaders
)仅适用于特定于内容的头,例如Content-Type
,Content-Length
等。
您已经说明您不能使用DefaultRequestHeaders
,因为您只需要它来处理单个请求 - 但您也不能在PostAsync
中使用它 - 只能在SendAsync
中使用,前提是您自己构造HttpRequestMessage
,根据您自己的答案和@NeilMoss的答案 - 但以后您可以使用扩展方法。
但为了其他读者的利益,另一种选择是添加一个基于现有的PostAsync
的新扩展方法,这实际上非常简单(仅需3行!):
public Task<HttpResponseMessage> PostAsync( this HttpClient httpClient, Uri requestUri, HttpContent content, String basicUserName, String basicPassword, String? challengeCharSet = null, CancellationToken cancellationToken = default )
{
if( basicUserName.IndexOf(':') > -1 ) throw new ArgumentException( message: "RFC 7617 states that usernames cannot contain colons.", paramName: nameof(basicUserName) );
HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.Post, requestUri );
httpRequestMessage.Content = content;
Encoding encoding = Encoding.ASCII;
if( challengeCharSet != null )
{
try
{
encoding = Encoding.GetEncoding( challengeCharSet );
}
catch
{
encoding = Encoding.ASCII;
}
}
httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue(
scheme : "Basic",
parameter: Convert.ToBase64String( encoding.GetBytes( userName + ":" + password ) )
);
return SendAsync( httpRequestMessage, cancellationToken );
}
用法:
HttpClient httpClient = ...
using( HttpResponseMessage response = await httpClient.PostAsync( uri, content, basicUserName: "AzureDiamond", basicPassword: "hunter2" ).ConfigureAwait(false) )
{
// ...
}