Невозможно взаимодействовать с API в веб-приложении, но оно работает в консольном приложении - PullRequest
0 голосов
/ 19 июня 2019

Я перевожу свое существующее консольное приложение в веб-приложение.Я делаю вызов API в контроллере.Приведенный ниже код прекрасно работает в консольном приложении.Но в веб-приложении я получаю исключение на var result = webClient.DownloadString(sourceUrl); с сообщением "unable to connect to remote server", а внутреннее исключение говорит: {"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond}System.Exception {System.Net.Sockets.SocketException}

Я попытался передать URL-адрес как объект uri, отредактированный файл web.config для включенияучетные данные по умолчанию, servicepointmanager и т. д. Я также попытался сделать его асинхронным, используя async и await.Я действительно не знаю, что происходит.Я нахожусь за корпоративным прокси, но вызов API прекрасно работает в консольном приложении и Postman.

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;

namespace webApp.Controllers
{
    public class DataController : ApiController
    {
        private string sourceUrl="http://api.openweathermap.org/data/2.5/weather?zip=94040,us&appid=YOURID";
        [Route("")]
        public void GetAlldata()
        {
            var dataCall = DownloadData(sourceUrl);

        }


        private string DownloadData(string url)
        {
            try
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                var webClient = new WebClient();
                IWebProxy wp = WebRequest.DefaultWebProxy;
                wp.Credentials = CredentialCache.DefaultCredentials;
                webClient.Proxy = wp;
                var result = webClient.DownloadString(sourceUrl);

                return result;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

1 Ответ

1 голос
/ 24 июня 2019

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

 IWebProxy wp = WebRequest.DefaultWebProxy;
    wp.Credentials = CredentialCache.DefaultCredentials;
    webClient.Proxy = wp;

и явное добавление ниже к web.config исправило это. Я не знаю, почему веб-приложение не получает прокси по умолчанию из кода, а консольное приложение -. Любое объяснение этого поведения будет оценено.

<system.net>
    <defaultProxy>
      <proxy usesystemdefault="False" proxyaddress="http://proxy.MYCOMPANY.com:8080" bypassonlocal="True" />
    </defaultProxy>
  </system.net>
...