2016-03-10 116 views
0

使用Visual Studio 2013我創建了一個新的Web API 2項目和一個新的MVC項目。將有其他客戶端訪問API,這是它創建的原因。最終API的客戶端將允許用戶使用Facebook和其他創建登錄帳戶。Web令牌認證 - 無MediaTypeFormatter

我遇到的問題是嘗試讀取登錄期間從API返回的錯誤,如錯誤密碼。我看到很多很多關於類似錯誤的帖子「沒有MediaTypeFormatter可用於從媒體類型爲'text/html'的內容中讀取類型爲的東西。」但無法解決此問題。

的API只需要返回JSON所以在我WebApiConfig.cs文件 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

這是我在提琴手後

enter image description here

這裏是迴應:

enter image description here

and the Textview of the response whic^h看起來像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可從與媒體類型‘text/html的’內容閱讀類型的對象‘TokenError’。 「

回答

0

經過一番搜索似乎沒有太多毛病,除了在網頁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; } 
    }