2016-03-10 3 views
0

Использование Visual Studio 2013 Я создал новый проект Web API 2 и новый проект MVC. Другие клиенты будут обращаться к API, который является причиной его создания. В конечном итоге клиенты для API позволят пользователям создавать учетную запись с помощью Facebook и других.Аутентификация веб-токена - нет MediaTypeFormatter доступно

Проблема, с которой я столкнулся, попробовать прочитать ошибки, возвращенные API при входе в систему, например Bad Bad. Я видел много и много сообщений о подобных ошибках: «No MediaTypeFormatter доступен для чтения объекта типа что-то из контента с типом мультимедиа 'text/html'." но не может решить эту проблему.

В API только нужно вернуть JSON так в моем WebApiConfig.cs файл GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

Вот мой пост в Скрипач

enter image description here

Вот ответ:

enter image description here

и текстовое представление ответа whic ч выглядит как JSON мне enter image description here

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     Yoda test = new Yoda() { email = model.Email, password = model.Password }; 

     HttpClient client = CreateClient(); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

     //client.DefaultRequestHeaders.TryAddWithoutValidation("content-type", "application/x-www-form-urlencoded"); 
     client.DefaultRequestHeaders.TryAddWithoutValidation("content-type", "application/json"); 

     HttpResponseMessage result = await client.PostAsJsonAsync(_apiHostURL, test); 

     result.EnsureSuccessStatusCode(); 

     if (result.IsSuccessStatusCode) 
     { 
      var token = result.Content.ReadAsAsync<TokenError>(new[] { new JsonMediaTypeFormatter() }).Result; 
     } 

public class TokenError 
{ 
    [JsonProperty("access_token")] 
    public string AccessToken { get; set; } 
    [JsonProperty("token_type")] 
    public string TokenType { get; set; } 
    [JsonProperty("expires_in")] 
    public int ExpiresIn { get; set; } 
    [JsonProperty("refresh_token")] 
    public string RefreshToken { get; set; } 
    [JsonProperty("error")] 
    public string Error { get; set; } 
} 

public class Yoda 
{ 
    public string email { get; set; } 

    public string password { get; set; } 

    public string grant_type 
    { 
     get 
     { 
      return "password"; 
     } 
    } 
} 

Точная ошибка «Нет MediaTypeFormatter не доступна для чтения объекта типа„TokenError“от содержания с типом носителя„текст/html“. "

ответ

0

После долгих поисков он оказывается там не было много плохога с моим кодом, за исключением, что конечная точка маркеров в Web Api не принимает JSON. Я играл в консольном приложении.

using Newtonsoft.Json; 
    using System.Net.Http.Formatting; //Add reference to project. 

    static void Main(string[] args) 
    { 
     string email = "[email protected]"; 
     string password = "[email protected]"; 

     HttpResponseMessage lresult = Login(email, password); 

     if (lresult.IsSuccessStatusCode) 
     { 
     // Get token info and bind into Token object.   
      var t = lresult.Content.ReadAsAsync<Token>(new[] { new JsonMediaTypeFormatter() }).Result; 
     } 
     else 
     { 
      // Get error info and bind into TokenError object. 
      // Doesn't have to be a separate class but shown for simplicity. 
      var t = lresult.Content.ReadAsAsync<TokenError>(new[] { new JsonMediaTypeFormatter() }).Result;     
     } 
    } 

    // Posts as FormUrlEncoded 
    public static HttpResponseMessage Login(string email, string password) 
    { 
     var tokenModel = new Dictionary<string, string>{ 
      {"grant_type", "password"}, 
      {"username", email}, 
      {"password", password}, 
      }; 

     using (var client = new HttpClient()) 
     { 
      // IMPORTANT: Do not post as PostAsJsonAsync. 
      var response = client.PostAsync("http://localhost:53007/token", 
       new FormUrlEncodedContent(tokenModel)).Result; 

      return response; 
     } 
    } 

     public class Token 
    { 
     [JsonProperty("access_token")] 
     public string AccessToken { get; set; } 

     [JsonProperty("token_type")] 
     public string TokenType { get; set; } 

     [JsonProperty("expires_in")] 
     public int ExpiresIn { get; set; } 

     [JsonProperty("userName")] 
     public string Username { get; set; } 

     [JsonProperty(".issued")] 
     public DateTime Issued { get; set; } 

     [JsonProperty(".expires")] 
     public DateTime Expires { get; set; } 
    } 

    public class TokenError 
    {    
     [JsonProperty("error_description")] 
     public string Message { get; set; } 
     [JsonProperty("error")] 
     public string Error { get; set; } 
    } 
Смежные вопросы