问题描述
我在我们的服务器上运行了一个 .Net Core 2.1 Web API。现在我有一个 .NET 4.0 应用程序,我想在其中使用网络服务。
当我在本地主机上本地运行它时,我设法从 api 获取数据。将api部署到服务器,在应用中修改url后,不起作用。
当我调用 WebRequest.GetRepsonse() 时没有任何反应,直到它超时并抛出带有 timoeout 消息的异常。
Web API 在 IIS 上运行,我已经在服务器上启用了 TLS 1.0、TLS 1.1、TLS 1.2。
当我从 Postman 发出 POST 请求时,ist 工作正常。我们正在使用代理进行 Internet 连接,但由于客户端和服务器都在同一网络中,我认为这不可能是代理设置。我也尝试设置代理设置,但仍然无法正常工作。
我现在没有想法了。有人可以帮忙吗?
这是我的代码:
客户端应用 C#.NET 4.0:
var resultDt = new DataTable();
var url = "https://myServer:5100/api/Service/Execute";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
request.UseDefaultCredentials = true;
request.ContentType = "application/json";
request.Method = "POST";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072;
try
{
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = string.Format("{{\"CommandText\":\"{0}\"}}",query);
streamWriter.Write(json);
}
using(var response = (HttpWebResponse)request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
var result = reader.ReadToEnd();
if (!string.IsNullOrEmpty(result))
{
var rows = JArray.Parse(result);
foreach (var row in rows.Children())
{
var columns = row.Children<JProperty>();
if (resultDt.Columns.Count == 0)
{
foreach (var column in columns)
{
resultDt.Columns.Add(new DataColumn()
{
ColumnName = column.Name,DataType = typeof(string)
});
}
}
var newRow = resultDt.NewRow();
foreach (var column in columns)
{
newRow[column.Name] = column.Value;
}
resultDt.Rows.Add(newRow);
}
}
}
}
}
catch (Exception ex)
{
Logger.Instance().Fatal(ex.Message,ex);
}
return resultDt;
注意: 当我使用 HTTPS 时,程序在 request.GetRequestStream() 中挂起。 当我使用 HTTP 时,程序在 request.GetResponse() 中挂起。
很奇怪
解决方法
我终于找到了解决方案:我只需要将代理设置为空实例:
request.Proxy = new WebProxy();
我发现在 Wireshark 中,来自 .NET 4.0 应用程序的请求将发送到代理端口,而邮递员正在使用正确的端口。
还是谢谢