【问题标题】:Web Token Authenication - No MediaTypeFormatter availableWeb 令牌身份验证 - 没有可用的 MediaTypeFormatter
【发布时间】:2016-03-10 15:19:22
【问题描述】:

使用 Visual Studio 2013,我创建了一个新的 Web API 2 项目和一个新的 MVC 项目。将有其他客户端访问 API,这就是创建它的原因。最终,API 的客户端将允许用户使用 Facebook 和其他方式创建登录帐户。

我在尝试读取登录期间从 API 返回的错误时遇到的问题,例如密码错误。我已经看到很多很多关于类似错误的帖子“没有 MediaTypeFormatter 可用于从媒体类型为'text/html'的内容中读取类型为 something 的对象”。但无法解决此问题。

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

这是我在 Fiddler 中的帖子

这是回复:

以及对我来说看起来像 json 的响应的 Textview

[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’类型的对象。”

【问题讨论】:

    标签: c# json webapi2


    【解决方案1】:

    经过大量搜索,我的代码似乎没有太大问题,只是 Web Api 中的 Token 端点不接受 json。我正在玩控制台应用程序。

        using Newtonsoft.Json;
        using System.Net.Http.Formatting; //Add reference to project.
    
        static void Main(string[] args)
        {
            string email = "test@outlook.com";
            string password = "Password@123x";
    
            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; }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多