REST 服务切换到 https,在浏览器中工作,在 c# 中抛出“(403) Forbidden”错误

Posted

技术标签:

【中文标题】REST 服务切换到 https,在浏览器中工作,在 c# 中抛出“(403) Forbidden”错误【英文标题】:REST service switched to https, works in browser, throwing a "(403) Forbidden" error in c# 【发布时间】:2017-08-16 12:18:44 【问题描述】:

NOAA 最近将他们的服务从 http 切换到 https,并且已经运行多年的 c# 调用现在返回“远程服务器返回错误:(403) Forbidden。”

奇怪的是,浏览器和 Postman 都可以使用相同的调用。为什么服务器会拒绝一个请求而不是另一个请求,我错过了什么?

网址:https://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?zipCodeList=44113&product=time-series&begin=2017-03-23T00:00:00&temp=temp&appt=appt&pop12=pop12

根据下面接受的答案修改了示例代码。两个版本都没有设置 UserAgent,显然现在需要这样做:

string xml = "";
string url = "";
try

    using (System.Net.WebClient wc = new System.Net.WebClient())
    
        url = "https://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?zipCodeList=44113&product=time-series&begin=2017-03-23T00:00:00&temp=temp&appt=appt&pop12=pop12";
        wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; .NET CLR 3.5.20404)");
        xml = wc.DownloadString(new Uri(url));
    
    //......  

catch (Exception ex)

    LogError(ex);

或者这个

string xml = ""; 
string url = "";
url = "https://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?zipCodeList=44113&product=time-series&begin=2017-03-23T00:00:00&temp=temp&appt=appt&pop12=pop12";
HttpWebRequest httpWR = (HttpWebRequest)WebRequest.Create(url);
httpWR.Method = WebRequestMethods.Http.Get;
httpWR.Accept = "application/xml";
httpWR.UserAgent = ".NET Framework Client";
try

    using (HttpWebResponse response = (HttpWebResponse)httpWR.GetResponse())
    
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        
            xml = reader.ReadToEnd();
        
    
    //......

catch (Exception ex)

    LogError(ex);

【问题讨论】:

【参考方案1】:

我认为该服务需要有效的用户代理。

我已经修改了你的代码以包含它。

using (System.Net.WebClient wc = new System.Net.WebClient())
        
            url = "https://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?zipCodeList=44113&product=time-series&begin=2017-03-23T00:00:00&temp=temp&appt=appt&pop12=pop12";

            wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; .NET CLR 3.5.20404)");


            xml = wc.DownloadString(url);
        

【讨论】:

@Plamen Kouzov 我已经测试并更新了我的答案。它有效。 @Plamen Kouzov 请在拨打wc.DownloadString(url) 之前拨打用户代理电话,我让它正常工作,没有任何错误。你现在遇到什么错误? 我有 ServicePointManager.ServerCertificateValidationCallback = delegate return true; ;就在 xml = wc.DownloadString(new Uri(url)); 之前我想知道他们是否出于某种原因没有将我们列入黑名单。 @Plamen Kouzov 哦不!请刷新页面。从那以后,我将答案更改为其他内容。最初的那个是错误的。 完美!我希望我能再对你的答案投票几次。

以上是关于REST 服务切换到 https,在浏览器中工作,在 c# 中抛出“(403) Forbidden”错误的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework - response.set_cookie() 不在浏览器中设置 cookie,但在邮递员和可浏览 api 中工作

请求 REST POST API 在 Postman 中工作,但在 Alamofire 中不起作用

Yii REST POST 在 POSTMAN 中不工作,但在框架中工作

我无法悬停在 Bootstrap 轮播中工作

没有 REST 端点在 Spring Boot 应用程序中工作

jwt令牌的刷新如何在django REST angular中工作