MVC4の新しいWebAPI機能を使用してメソッドを作成し、Azureで実行しています。このメソッドでは、UsernameプロパティとPasswordプロパティで構成される単純なLoginModelオブジェクトを投稿する必要があります。はい、このスピードバンプを乗り越えたら、これをさらに保護する予定です:-)メソッドは、Json形式のオブジェクトで応答します。
リクエストヘッダーに「Content-Type:application/json」を含めると、Fiddlerを使用してこのメソッドを正常に呼び出すことができます。 200で戻り、Fiddler Inspectorに移動して、Json応答オブジェクトを問題なく表示できます。
ただし、C#/ XAMLを使用してWindows8のMetroUIアプリからこれと同じメソッドを呼び出す際に問題が発生します。私はC#でHttpClientと新しい非同期の概念をいじり始めました。Post呼び出しをどのようにフォーマットしたかに関係なく(Content-Typeを「application/json」にすることを明示的に呼び出した場合でも)Fiddlerは500エラーで戻りますそして、その試みはContent-Type: "text/html"を使用していたと述べています。私はこれが問題の根源であると信じています:
このメソッドに投稿してJsonオブジェクトを取得するために、考えられるすべてのことを試しました。これが私の最新の試みです。
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}");
client.PostAsync("http://myapi.com/authentication", content).ContinueWith(result =>
{
var response = result.Result;
response.EnsureSuccessStatusCode();
});
これにより、Content-Typeが「text/html」に設定された500エラーが発生します。
これも失敗した別の試みでした:
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.PostAsync("http://myapi.com/authentication", new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}", Encoding.UTF8, "application/json"));
string statusCode = response.StatusCode.ToString();
誰かが私を正しい方向に向けることができますか?
Nemesvのアドバイスのおかげで、次のコードを試してみました。
HttpClient httpClient = new HttpClient();
HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpResponseMessage response = await httpClient.PostAsync("http://webapi.com/authentication", content);
string statusCode = response.StatusCode.ToString();
response.EnsureSuccessStatusCode();
リクエストヘッダーに「application/json」が表示されるようになりましたが、Webセッションには「text/html」が表示されます。
これを試して、Headers.ContentType
を設定してください。
HttpClient httpClient = new HttpClient();
HttpContent content = new StringContent(@"{ ""Username"": """ + "etc." + @"""}");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpResponseMessage response =
await httpClient.PostAsync("http://myapi.com/authentication", content);
string statusCode = response.StatusCode.ToString();
これが機能しているいくつかの欠落した試みがあります。
UserLoginModel user = new UserLoginModel { Login = "username", Password = "password" };
string json = Newtonsoft.Json.JsonConvert.SerializeObject(user);
HttpContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:1066/api/");
HttpResponseMessage response = client.PostAsync("Authenticate", content).Result;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsAsync<ResultModel>().Result;
}
else
{
return string.Empty;
}