基本的なHTTP認証を必要とするサードパーティのサービスにHttpClient
を使用しようとしています。 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を使用して生のトラフィックをスニッフィングし、認証を発見しましたヘッダーは送信されていません。
this を見ましたが、AuthenticationHeaderValue
コンストラクターの一部として指定された認証スキームを持っていると思います。
見逃したことはありますか?
あなたのコードは動作するはずです-Authorizationヘッダーを設定する同様の問題に遭遇し、設定する代わりにHeaders.Add()を実行することで解決したことを覚えています:
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));
PDATE: request.Contentを実行すると、すべてのヘッダーがコンテンツオブジェクトに反映されるわけではありません。これを確認するには、request.Headersとrequest.Content.Headersを調べます。試してみたいことの1つは、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;
これも機能し、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);