0

Visual Studio 2013 を使用して、新しい Web API 2 プロジェクトと新しい MVC プロジェクトを作成しました。API が作成された理由である API にアクセスする他のクライアントが存在します。最終的には、API のクライアントにより、ユーザーは Facebook などを使用してログイン アカウントを作成できるようになります。

Bad Password などのログイン中に API から返されたエラーを読み取ろうとしている問題。「メディア タイプが 'text/html' のコンテンツから何かのタイプのオブジェクトを読み取るために MediaTypeFormatter を使用できません。」のようなエラーに関する多くの投稿を見てきました。しかし、この問題を解決できません。

API は json を返すだけでよいので、私の WebApiConfig.cs ファイルには GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

これがフィドラーでの私の投稿です

ここに画像の説明を入力

応答は次のとおりです。

ここに画像の説明を入力

そして、私には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";
        }
    }
}

正確なエラーは、「メディア タイプ 'text/html' のコンテンツからタイプ 'TokenError' のオブジェクトを読み取るために使用できる MediaTypeFormatter がありません。」

4

1 に答える 1

0

多くの検索の後、Web Api のトークン エンドポイントが 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; }
    }
于 2016-03-11T23:19:18.353 に答える