【问题标题】:HttpClient returns The server committed a protocol violation - Browser returns correct dataHttpClient 返回服务器违反协议 - 浏览器返回正确数据
【发布时间】:2014-10-15 01:04:38
【问题描述】:

我正在尝试通过会员重启来设置 github。

如果我尝试从像这样的浏览器调用 github api

https://api.github.com/user?access_token=XXXXXXX

如果我从 .net 尝试,我可以看到所有有效的 json 数据

  public ActionResult Index()
    {
        var url = "https://api.github.com/user?access_token=XXXXXXXX";
        ////add additional params
        //if (additionalParams != null)
        //{
        //    foreach (string key in additionalParams)
        //    {
        //        url += string.Format("&{0}={1}", key, additionalParams[key]);
        //    }
        //}

        HttpClient client = new HttpClient();
        var result =  client.GetAsync(url).Result;
        if (result.IsSuccessStatusCode)
        {
            var json =  result.Content.ReadAsStringAsync().Result;
            var profile = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
            //return GetClaimsFromProfile(profile);
        }
        return View();
    }

我得到一个错误

服务器违反了协议。 Section=ResponseStatusLine

HttpClient 不喜欢我正在尝试的什么?我需要提供浏览器为我做的额外细节吗?

任何帮助将不胜感激!

【问题讨论】:

  • 你看过最终的网址了吗?会不会有换行符或非法字符?
  • 最终的 url 看起来不错,对于上面的示例,我将 url 更改为硬编码字符串,但这是代码中的实际值
  • 实际值是多少?您没有为 additionalParams 提供值,我怀疑问题是由它包含的值引起的

标签: c# webclient


【解决方案1】:

添加

<system.net>
    <settings>
      <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
  </system.net>

到我的 web.config 似乎可以解决问题...我真的不明白为什么我需要添加它,但它可以工作。

【讨论】:

    【解决方案2】:

    不确定这里是否相关,但我在 https://api.github.com/user 端点上遇到了同样的问题。我的解决方案比我想象的要简单,但还是很烦人,因为我花了几个小时才找到。

    User-Agent 应该传递给 API 端点,也许它在这里也可以通过指定 User-Agent 来工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2017-06-17
      • 1970-01-01
      • 2013-01-29
      • 2019-09-22
      相关资源
      最近更新 更多