无法与 Web 应用程序中的 API 交互,但它在控制台应用程序中有效
Unable to interact with an API in web app but it works in console app
我正在将我现有的控制台应用程序迁移到网络应用程序。我正在控制器中进行 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;
}
}
}
}
顺便提一下,在我的家庭网络中尝试上述代码并成功后,我将问题确定为代理问题。从我的代码中删除以下内容
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>
我正在将我现有的控制台应用程序迁移到网络应用程序。我正在控制器中进行 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;
}
}
}
}
顺便提一下,在我的家庭网络中尝试上述代码并成功后,我将问题确定为代理问题。从我的代码中删除以下内容
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>