我有这个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);
}
答案 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);
}