Подтвердить что ты не робот

Вызов методов MVAP4 WebAPI от клиента С# Metro UI с использованием PostAsync, HttpClient & Json

Я создал метод, использующий новые функции WebAPI в MVC4 и запускаю его на Azure. Метод требует, чтобы вы опубликовали простой объект LoginModel, который состоит из свойства Username и Password. Да, я планирую обеспечить это дальше, как только я преодолею эту ошибку скорости:-) Затем метод отвечает на объект в формате Json:

enter image description here

Я могу успешно вызвать этот метод, используя Fiddler, при условии, что я включу "Content-Type: application/json" в заголовки запроса. Он возвращается с 200, и я могу зайти в инспектор Fiddler и очень хорошо рассмотреть объект ответа Json:

enter image description here

Однако у меня возникают проблемы с вызовом этого же метода из приложения MetroUI в Windows8 с использованием С#/XAML. Я начал играть с HttpClient и новыми концепциями Async на С# и независимо от того, как я отформатировал свои вызовы 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();
        });

Это приводит к ошибке 500 с типом Content-Type, установленным в "text/html"

Вот еще одна неудачная попытка:

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" в моем заголовке запроса, но все еще показывает "text/html" в веб-сеансе:

enter image description here

4b9b3361

Ответ 1

Попробуйте установить 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();

Ответ 2

Есть некоторые недостающие попытки работать.

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