我正在尝试简单显示github存储库。网址“https://api.github.com/search/repositories?q=pluralsight”在我的浏览器中工作,返回json并在fiddler中工作,但我的.NET Web App中的以下内容出现403 Forbidden错误。任何人都可以帮我理解修复吗?我的控制器如下:
public class HomeController : Controller
{
public ActionResult Index()
{
Tweets model = null;
var client = new HttpClient();
var task = client.GetAsync("https://api.github.com/search/repositories?q=pluralsight")
.ContinueWith((taskwithresponse) =>
{
var response = taskwithresponse.Result;
response.EnsureSuccessStatusCode();
var readtask = response.Content.ReadAsAsync<Tweets>();
readtask.Wait();
model = readtask.Result;
});
task.Wait();
return View(model.results);
}
}
我有一个如下定义的类(忽略它被称为推文)最初试图访问twitter api。
namespace HttpClientMVCDemo.Controllers
{
public class Tweets
{
public Tweet[] results;
}
public class Tweet
{
[JsonProperty("name")]
public string UserName { get; set; }
[JsonProperty("id")]
public string id { get; set; }
}
}
根据下面的Amit类自动生成代码视图:
@model IEnumerable<HttpClientMVCDemo.Controllers.Gits>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.total_count)
</th>
<th>
@Html.DisplayNameFor(model => model.incomplete_results)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.total_count)
</td>
<td>
@Html.DisplayFor(modelItem => item.incomplete_results)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /*id=item.PrimaryKey*/ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
答案 0 :(得分:3)
这里有一些模型类的修改
第一个Json字符串包含项数组<}> 结果
你忘记在模型类中提供get和set property。
所以这是新修改的模型类。
public class Tweets
{
public int total_count { get; set; }
public bool incomplete_results { get; set; }
public List<Item> items { get; set; }
}
public class Item
{
public int id { get; set; }
public string name { get; set; }
public string full_name { get; set; }
}
要从该网址获取数据,您需要在请求中添加User-Agent
标头。
并将其添加到您的web.cofig文件
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
所以这里是完整的代码。
Tweets model = null;
var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "http://developer.github.com/v3/#user-agent-required");
var task = client.GetAsync("https://api.github.com/search/repositories?q=pluralsight")
.ContinueWith((taskwithresponse) =>
{
var response = taskwithresponse.Result.Content.ReadAsStringAsync();
response.Wait();
model = JsonConvert.DeserializeObject<Tweets>(response.Result);
});
task.Wait();
return View(model.items);
在您看来应该接受这种类型的模型
@model IEnumerable<HttpClientMVCDemo.Controllers.Item>
答案 1 :(得分:1)
您的浏览器会自动为请求添加多个接受标头。您可能必须在请求中添加标头以避免使用403。
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/json");
类似的问题是here。最简单的方法是使用Fiddler检查您的请求。
此外,您不应在异步电话上拨打Wait
。最好将操作声明为async
并调用await client.GetAsync();
否则可能会导致死锁。请参阅here。
答案 2 :(得分:0)
HTTP 403:由于来自github站点的管理规则而引发了禁止访问。
从github网站访问api(https://api.github.com/)时需要'User-Agent'标头。
可以使用以下代码解决此问题:
lineJoin.on(criteriaBuilder.equal(root.get(Courses_.student)