web-dev-qa-db-ja.com

PostAsync、HttpClient、およびJsonを使用してC#MetroUIクライアントからMVC4WebAPIメソッドを呼び出す

MVC4の新しいWebAPI機能を使用してメソッドを作成し、Azureで実行しています。このメソッドでは、UsernameプロパティとPasswordプロパティで構成される単純なLoginModelオブジェクトを投稿する必要があります。はい、このスピードバンプを乗り越えたら、これをさらに保護する予定です:-)メソッドは、Json形式のオブジェクトで応答します。

enter image description here

リクエストヘッダーに「Content-Type:application/json」を含めると、Fiddlerを使用してこのメ​​ソッドを正常に呼び出すことができます。 200で戻り、Fiddler Inspectorに移動して、Json応答オブジェクトを問題なく表示できます。

enter image description here

ただし、C#/ XAMLを使用してWindows8のMetroUIアプリからこれと同じメソッドを呼び出す際に問題が発生します。私はC#でHttpClientと新しい非同期の概念をいじり始めました。Post呼び出しをどのようにフォーマットしたかに関係なく(Content-Typeを「application/json」にすることを明示的に呼び出した場合でも)Fiddlerは500エラーで戻りますそして、その試みはContent-Type: "text/html"を使用していたと述べています。私はこれが問題の根源であると信じています:

enter image description here

このメソッドに投稿して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」が表示されます。

enter image description here

12
INNVTV

これを試して、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();
22
nemesv

これが機能しているいくつかの欠落した試みがあります。

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;
}
6
vast