HTTP-запрос с getasync не работает после того, как я опубликовать, но работает на localhost
Привет,
Я получаю RSS-каналы с URL-адреса с помощью HTTPClient, после того как все коды написаны и я тестирую на localhost, RSS-каналы извлекаются, но после публикации на сервере я получаю эту ошибку.
One or more errors occurred. at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task`1.get_Result() at dayrunnerapp.Controllers.HomeController.callRss(String url)
Вот что я попробовал сделать.
Что я уже пробовал:
это представление контроллера
public ActionResult News() { try { var url = "http://www.inboundlogistics.com/cms/rss-feed"; string html = string.Empty; html = callRss(url); XDocument xml = XDocument.Parse(html); var RSSFeedData = (from x in xml.Descendants("item") select new FeedObjects { Title = ((string)x.Element("title")), Link = ((string)x.Element("link")), test = ((string)x.Element("description").Value), Description = ((string)x.Element("description").Value.Replace("/cms//", "http://").Replace(")", "")), Date = ((string)x.Element("pubDate")) }); ViewBag.RSSFeed = RSSFeedData; ViewBag.URL = url; } catch (Exception e) { ViewBag.Error = e.Message+"\n\r"+e.StackTrace; Console.WriteLine(e.Message); } return View(); }
это функция callRss
[HttpGet, AllowCrossSiteJson] private string callRss(string url) { string html = String.Empty; cli = new HttpClient(); cli.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); cli.Timeout = TimeSpan.FromMilliseconds(100000); try { HttpResponseMessage result = cli.GetAsync(url).Result; html = Encoding.UTF8.GetString(result.Content.ReadAsByteArrayAsync().Result); } catch (Exception ex) { html = ex.Message +"\n\r"+ ex.StackTrace; } return html; }
Это прекрасно работает на localhost, ничего не меняя, я публикую и развертываю, но получаю вышеупомянутую ошибку, когда запускаю URL-адрес на сервере. Пожалуйста, что я еще не принял во внимание?
Richard Deeming
Вам нужно будет изучить исключение, чтобы выяснить, что такое "одна или несколько ошибок".
Я был бы склонен начать с правильного написания вашего кода async
, и перестать глотать исключения:
private async Task<string> callRss(string url) { var cli = new HttpClient(); cli.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); cli.Timeout = TimeSpan.FromMilliseconds(100000); HttpResponseMessage result = await cli.GetAsync(url); result.EnsureSuccessStatusCode(); return await result.Content.ReadAsStringAsync(); } public async Task<ActionResult> News() { const string url = "http://www.inboundlogistics.com/cms/rss-feed"; string html = await callRss(url); ... }
EasyHero
Вот ошибка после обновления моего кода, как вы предложили "произошла ошибка при отправке запроса. Невозможно подключиться к удаленному серверу попытка подключения не удалась из-за того, что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение из-за того, что подключенный хост не ответил 23.38.53.172:80 в System.Runtime.Услуги компиляторов.TaskAwaiter.ThrowForNonSuccess(задача задачи)"
Richard Deeming
Похоже на ошибку DNS на вашем сервере. Этот IP-адрес, по-видимому, относится к a23-38-53-172.deploy.static.akamaitechnologies.com, а не домен, который вы пытаетесь загрузить.
Jason Gleim
Глупый вопрос... вы открыли браузер на сервере и попытались открыть URL-адрес в нем, чтобы подтвердить, что вы действительно можете добраться до сайта с сервера? Исключение происходит внутри задачи, которая не очень хорошо справляется с выявлением реальной проблемы. Вы можете попробовать вернуть внутреннее исключение и посмотреть, что вы получите.
EDIT: я полностью пропустил недостающее ожидание! Что он тоже сказал ^^^^ :-)
EasyHero
Да, я открыл url-адрес в браузере, и он возвращает xml-файл, как и ожидалось