C# 未发送HttpClient身份验证标头

C# 未发送HttpClient身份验证标头,c#,.net-4.5,wcf-web-api,dotnet-httpclient,C#,.net 4.5,Wcf Web Api,Dotnet Httpclient,我正在尝试将HttpClient用于需要基本HTTP身份验证的第三方服务。我正在使用AuthenticationHeaderValue。以下是我到目前为止得出的结论: HttpRequestMessage<RequestType> request = new HttpRequestMessage<RequestType>( new RequestType("third-party-vendor-action"), MediaTyp

我正在尝试将
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;
HttpRequestMessage请求=
新的HttpRequestMessage(
新的RequestType(“第三方供应商行动”),
MediaTypeHeaderValue.Parse(“应用程序/xml”);
request.Headers.Authorization=新建AuthenticationHeaderValue(
“基本”,转换.tobase64字符串(System.Text.ascienceoding.ASCII.GetBytes(
格式(“{0}:{1}”,“用户名”,“密码”);
var task=client.PostAsync(Uri、request.Content);
ResponseType response=task.ContinueWith(
t=>
{
返回t.Result.Content.ReadAsAsync();
}).Unwrap().Result;
看起来POST操作工作正常,但我没有得到预期的数据。通过一些尝试和错误,并最终使用Fiddler嗅探原始流量,我发现授权标头没有被发送

我看到了,但我想我已经将身份验证方案指定为
AuthenticationHeaderValue
构造函数的一部分


有什么我遗漏的吗?

您的代码看起来应该可以工作-我记得在设置授权标头时遇到了类似的问题,并通过执行headers.Add()而不是设置来解决:

request.Headers.Add(“授权”、“基本”+Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format(“{0}:{1}”、“用户名”、“密码”))));
更新: 看起来,当您执行request.Content时,并不是所有的头都反映在内容对象中。您可以通过检查request.Headers和request.Content.Headers来了解这一点。您可能想尝试的一件事是使用SendAsync而不是PostAsync。例如:

HttpRequestMessage请求=
新的HttpRequestMessage(
新的RequestType(“第三方供应商行动”),
MediaTypeHeaderValue.Parse(“应用程序/xml”);
request.Headers.Authorization=
新的AuthenticationHeaderValue(
“基本”,
Convert.tobase64字符串(
System.Text.ascienceoding.ASCII.GetBytes(
格式(“{0}:{1}”,“用户名”,“密码”);
request.Method=HttpMethod.Post;
request.RequestUri=Uri;
var task=client.sendaync(请求);
ResponseType response=task.ContinueWith(
t=>
{返回t.Result.Content.ReadAsAsync();})
.Unwrap().Result;

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

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

这对我很有用。

这也可以,而且您不必处理base64字符串转换:

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

实际上,您的问题在于
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);

我尝试了类似的
request.Headers.Authorization
,得到了相同的结果。这让我有点头疼,因为我不完全确定下一步该尝试什么。我知道MVC4测试版和4.5预览版在某些方面是直接不兼容的-我想知道这是否与此有关?您的更新似乎至少发送了授权标头。我还不能从第三方服务中检索数据(可能是我错过了请求正文中的其他错误),但至少正确的头已经过了线。这是一个开始。非常感谢。ASCII还是UTF-8?请参阅。不幸的是,对于meThis,这里的选项都不起作用,但它会为所有请求设置授权头,不是吗?这是不可取的。对于使用该客户端实例发出的所有请求,都是这样。您是否使用同一客户端访问具有不同身份验证方案的端点?也就是说,您是否在客户端实例上设置了基址?这个解决方案比编码UID:PWD组合要干净得多。非常感谢。我花了几个小时试图将头附加到HttpClient,并使用GetAsync和PostAsync等,总的来说,我觉得WebAPI很痛苦(给我ServiceStack!!)谢谢!我将尝试在大型应用程序中修复共享httpclient的错误