我试图使用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
构造。
是不是有什么我已经错过了?
您的代码看起来像它应该工作 - 我记得运行到类似的问题设置授权头,然后通过执行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;
这也将工作,你就不必处理的base64字符串转换:
var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...
尝试设置在客户端上的标题:
DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", userName, password))));
这对我的作品。
其实你的问题是与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);