Служба REST переключилась на https, работает в браузере, выдавая ошибку (403) Forbidden в С#

NOAA недавно переключило свои службы с http на https, и вызов C#, который работал годами, теперь возвращает «Удаленный сервер вернул ошибку: (403) Запрещено».

Как ни странно один и тот же вызов работает из браузера и из Почтальона. Почему сервер отклоняет один запрос, а не другой, что мне не хватает?

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

Пример кода изменен в соответствии с принятым ответом ниже. Обе версии никогда не устанавливали 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);
}

person Plamen Kouzov    schedule 23.03.2017    source источник


Ответы (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);
        }
person scartag    schedule 23.03.2017
comment
@Plamen Kouzov я проверил и обновил свой ответ. оно работает. - person scartag; 23.03.2017
comment
@Plamen Kouzov, пожалуйста, поставьте вызов пользовательского агента, прежде чем звонить wc.DownloadString(url), у меня все работает без ошибок. Какую ошибку вы получаете сейчас? - person scartag; 23.03.2017
comment
У меня есть ServicePointManager.ServerCertificateValidationCallback = делегат {return true; }; непосредственно перед xml = wc.DownloadString(новый Uri(url)); Интересно, не занесли ли они нас в черный список по какой-то причине. - person Plamen Kouzov; 23.03.2017
comment
@Пламен Коузов О нет! пожалуйста, обновите страницу. с тех пор я изменил ответ на что-то другое. Тот первоначальный был неправильным. - person scartag; 23.03.2017
comment
Идеальный! Я хотел бы проголосовать за ваш ответ еще несколько раз. - person Plamen Kouzov; 23.03.2017
comment
@Plamen Kouzov Рад, что это помогло. Было бы неплохо, если бы вы могли принять ответ, пожалуйста :) - person scartag; 23.03.2017