HttpClient GetAsync方法403错误

时间:2016-02-28 16:24:33

标签: asp.net-mvc httpclient http-status-code-403

我正在尝试简单显示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>
}

3 个答案:

答案 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)

参考: https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#user-agent-required