【问题标题】:C# : REST url returns 404 while the same URL works in web browserC#:REST url 返回 404,而相同的 URL 在 Web 浏览器中工作
【发布时间】:2018-05-01 21:30:12
【问题描述】:

我有这个 REST api (GET),它在浏览器中运行良好并吐出 JSON。我什至使用 XMLHTTP 在 Excel-VBA 中尝试了相同的 API,它工作正常。

但是当我尝试在 C# 中使用相同的 API 时,我遇到了错误。

首先我得到:

“底层连接已关闭:发生意外错误 发送。”

就行了

HttpResponseMessage response = client.GetAsync(urlParameters).Result;

然后我将安全协议设置为“Tls11”,该错误消失了。

现在我正在回复404。网址是正确的。我可以在 Web 浏览器/VBA 中运行相同的 URL,但不能在 C# 中运行。

有什么建议或帮助吗?

抱歉,无法分享与工作相关的实际网址。

     private const string URL = "https://xxx-production-api.abc.com/api/listings/1790956";
        private string urlParameters = "?apiToken=64842d73-9761-456b-86fa-a75a409273ce";
        public string  Download()
        {

            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(URL);

           client.DefaultRequestHeaders.Accept.Add(
           new MediaTypeWithQualityHeaderValue("application/json"));

           client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ru;q=0.4"); 
            // List data response.
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
            HttpResponseMessage response = client.GetAsync(urlParameters).Result;  // Blocking call!
            if (response.IsSuccessStatusCode)                
                    Console.WriteLine("Worked");                           
            else           
                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); 
            }

【问题讨论】:

  • 当服务返回 404(未找到)时,很难说 URL 正确。 URL 不正确,或者服务错误地返回 404(在这种情况下,我们可能无能为力)。
  • 尝试将接受标头留空。不要请求 application/json,可能服务返回的是 JSON 格式的明文。
  • @brank 已经尝试过了 :)。我正处于您随机评论/取消评论行并希望它有效的阶段。还没有运气。
  • 您的浏览器中是否有任何类型的身份验证令牌或cookie?我曾经在浏览器中运行时遇到了一个问题,因为我已登录并不知不觉地传递了一个 cookie。
  • @DanWilson,不。完全在另一个浏览器中尝试过。相同的 url 也适用于 VBA。 C# 可能需要不同的东西。

标签: c# rest get


【解决方案1】:

回答我自己的问题: 将用户代理添加到标题为我解决了这个问题:client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")

从 Chrome 开发工具复制并粘贴标题信息,现在该 url 也可以在 C# 中使用。

【讨论】:

  • 它对我不起作用。你还有什么解决办法吗?
【解决方案2】:

确保您的工作防火墙/代理没有阻止通话。

我遇到了类似的问题,这是我用于 GET 调用的最终代码,看看它是否适合你。主要区别是我不使用“.Result”我使用“GetAwaiter().GetResult()”。

using (var client = new HttpClient())
{
    var method = string.Format("{0}{1}", ApiUrl, urlPart);
    client.BaseAddress = new Uri(ApiUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

    HttpResponseMessage response = client.GetAsync(method).GetAwaiter().GetResult();

    if (response.IsSuccessStatusCode)
    {
        var data = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();


        return data;
    }

    return default(T);
}

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2021-10-02
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多