.NET (元は Ruby で記述) を使用して既存の REST API を書き直す必要があります。クライアントの観点からは、古い API とまったく同じように動作する必要があります。つまり、クライアント コードを変更する必要はありません。現在の API には基本認証が必要です。したがって、古い API を呼び出すには、次のようにすると完全に機能します。
var wc = new System.Net.WebClient();
var myCache = new CredentialCache();
myCache.Add(new Uri(url), "Basic", new NetworkCredential("XXX", "XXX"));
wc.Credentials = myCache;
var returnBytes = wc.DownloadData("http://xxxx");
(セキュリティ上の理由から、実際の URL / ユーザー名 / パスワードなどは省略しなければなりませんでした)。
現在、MVC4 で ASP.Net Web API を使用して新しい API を作成しています。私は奇妙な問題を抱えており、まったく同じ問題を抱えている人を見つけることができません。基本認証をサポートするために、次のガイドラインに従いました。
http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/
1 つには、Application_Start() イベントの Global.asax.cs ファイルに "ハンドラーにフック" するコードを配置しました (これは説明されていなかったので推測しました)。
とにかく、上記のコードを使用して API (IIS にデプロイしたもの) を呼び出すと、Authorization ヘッダーは常に null になり、上記は 401 Unauthorized で失敗します。ただし、このコードを使用してヘッダーを手動で設定すると、正常に動作します。つまり、Authorization ヘッダーが存在するようになり、ユーザーを認証できます。
private void SetBasicAuthHeader(WebClient request, String userName, String userPassword)
{
string authInfo = userName + ":" + userPassword;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers["Authorization"] = "Basic " + authInfo;
}
.......
var wc = new System.Net.WebClient();
SetBasicAuthHeader(request, "XXXX", "XXXX");
var returnBytes = wc.DownloadData("http://xxxx");
それは機能しますが、既存の API の既存のユーザーがヘッダーを手動で設定することはないため、私には良くありません。
基本認証がどのように機能するかを読むと、最初のリクエストは匿名であることが意図されており、クライアントは 401 を返し、クライアントは再試行することを意図しています。ただし、コードにブレークポイントを配置すると、Antony の例ではコードに再びヒットすることはありません。ブレークポイントが 2 回ヒットすることを期待していました。
これを機能させる方法はありますか?