C#:REST网址返回404,而相同的网址在网络浏览器

时间:2018-05-01 21:30:12

标签: c# rest get

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

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

首先我得到了:

  

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

就行了

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

然后我将安全协议设置为`Tls11'那个错误消失了。

现在我在resposne中加注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); 
            }

2 个答案:

答案 0 :(得分:0)

回答我自己的问题: 将用户代理添加到标题中为我解决了这个问题: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开发者工具复制并粘贴了标题信息,现在该网址也在C#中运行。

答案 1 :(得分:-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);
}