当邮递员成功运行Web GET请求时,WebHttpRequest失败(500)

时间:2018-08-08 18:27:27

标签: c# ajax web-services httpwebrequest postman

我尝试从特定站点获取特定值...

该站点使用Ajax调用来定期更新值 https://www.plus500.co.il/api/LiveData/FeedUpdate?instrumentId=19

(您可以导航到该地址,然后看到XML响应。)

使用邮递员: 发送

GET /api/LiveData/FeedUpdate?instrumentId=19 HTTP/1.1
Host: www.plus500.co.il
Cache-Control: no-cache
Postman-Token: f823c87d-3edc-68ce-e1e7-02a8fc68be7a

我收到有效的Json响应...

但是,当我从C#中尝试时:

var webRequest = WebRequest.CreateHttp(@"https://www.plus500.co.il/api/LiveData/FeedUpdate?instrumentId=19");
webRequest.Method = "GET";
using (var response = webRequest.GetResponse())
{...}

请求失败,错误代码403(禁止)

添加时:

webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36";

请求失败,错误代码500(内部服务器错误)

添加(编辑)

我也开始与

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |
                                   SecurityProtocolType.Tls11 |
                                   SecurityProtocolType.Tls |
                                   SecurityProtocolType.Ssl3;

我也尝试设置一个CookieContainer,但结果是相同的500。

为什么邮递员/ Chrome浏览器成功查询了此API,而C#Webrequest没有查询?
有什么区别?

1 个答案:

答案 0 :(得分:1)

因此,失败的原因是由于默认情况下邮递员在客户端请求中包含了标头,尽管C#请求中没有标头。

使用像Fiddler(https://www.telerik.com/fiddler)这样的程序,您可以查看该请求以查看邮递员请求中的标头是:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8    
Accept-Encoding: gzip, deflate, br    
Accept-Language: en-US,en;q=0.9    
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36

C#还只是

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

这样填充额外的客户端请求标头可以使其正常运行:

webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
webRequest.Headers.Add("Accept-Encoding", "gzip deflate,br");
webRequest.Headers.Add("Accept-Language", "en-US,en;q=0.9");