25

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 アクションは正常に動作しているように見えますが、期待するデータが返されません。試行錯誤を繰り返し、最終的に Fiddler を使用して生のトラフィックを盗聴した結果、認証ヘッダーが送信されていないことがわかりました。

これを見たことがありますが、AuthenticationHeaderValueコンストラクターの一部として指定された認証スキームを持っていると思います。

見逃したものはありますか?

4

4 に答える 4

37

あなたのコードはうまくいくように見えます-Authorizationヘッダーを設定する同様の問題に遭遇し、それを設定する代わりにHeaders.Add()を実行することで解決したことを覚えています:

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

更新: request.Content を実行すると、すべてのヘッダーがコンテンツ オブジェクトに反映されていないように見えます。これは、request.Headers と request.Content.Headers を調べることで確認できます。PostAsync の代わりに SendAsync を使用することをお勧めします。例えば:

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;
于 2012-04-16T20:54:51.933 に答える
19

これも機能し、base64 文字列変換を処理する必要はありません。

var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...
于 2014-03-14T13:36:05.573 に答える
18

クライアントでヘッダーを設定してみてください。

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

これは私にとってはうまくいきます。

于 2012-05-17T01:58:58.510 に答える
6

実際にあなたの問題は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);
于 2015-03-06T12:30:05.743 に答える