使用Visual Studio 2013我创建了一个新的Web API 2项目和一个新的MVC项目。将有其他客户端访问API,这是它创建的原因。最终,API的客户端将允许用户使用Facebook和其他人创建登录帐户。
我在尝试读取登录期间从API返回的错误(例如Bad Password)时遇到的问题。我已经看过很多很多关于类似错误的帖子,而且没有MediaTypeFormatter可以从媒体类型&text; html&#39的内容中读取某种类型的对象;"但无法解决此问题。
API只需返回json,所以在我的WebApiConfig.cs文件中
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
这是我在Fiddler的帖子
以下是回应:
[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";
}
}
}
确切的错误是 &#34;没有MediaTypeFormatter可用于读取&#39; TokenError&#39;来自内容与媒体类型&#39; text / html&#39;。 &#34;
答案 0 :(得分:0)
经过多次搜索后,除了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; }
}