【发布时间】:2020-01-24 06:23:58
【问题描述】:
我有一个旧的 .Net 4.0 WinForms 应用程序(在 VB 中),它现在需要从 Web API 获取一些数据。 Web API 使用 .Net Core 3.1 编写,托管在 Azure App Service 上。
我最初尝试使用 HttpClient,但遇到了一些奇怪的错误,我认为这是因为 HttpClient 确实适用于 .Net 4.5 及更高版本。所以我现在尝试使用 WebClient 以及 WebRequest,但都给我这个错误:
“底层连接已关闭:发生意外错误 发送。” “无法从传输连接中读取数据:一个 现有连接被远程主机强行关闭。”
这是我的代码:
Dim uri As String = $"{apiUrl}/AzureStorage/Sas?section={section}&recordId={recordId}&filename={filename}"
Using client As New WebClient()
client.Headers.Add("clientId", clientId.ToString())
Dim response As String = client.DownloadString(uri)
End Using
我意识到我在 API 上启用了 CORS,因此对于那个特定的控制器,我通过在控制器顶部添加 [DisableCors] 装饰器来禁用 CORS,但这并没有什么区别。 Azure App Service 中也禁用了 CORS,所以我认为这不是 CORS 问题。
从 Angular 8 应用程序调用相同的 API 端点没有问题。当我从邮递员那里调用它时,它甚至可以工作。但是当我从 VB 应用程序调用时,我得到了异常。
响应应该是这个 JSON 对象:
{
"filename": null,
"sasUri": "https://propworx.blob.core.windows.net/devtest/sent_items/1/Repair Report (2).pdf?sv=2019-02-02&sr=b&sig=mO1nfJOc86aug9kESHciPs%2F1H04%2FNw7vdTiGYab3XJg%3D&se=2020-01-25T06%3A32%3A39Z&sp=rcw",
"blobUri": "https://propworx.blob.core.windows.net/devtest/sent_items/1/Repair Report.pdf",
"container": "devtest",
"storageServicesVersion": "2019-02-02",
"startTime": null,
"expiryTime": "2020-01-25T06%3A03%3A08Z",
"resource": "b",
"permissions": "rcw",
"ipRange": null,
"protocol": null,
"signature": "5CYUJ4oHMexx19EOnooyrwpeKrbJyyDGLVMf5Sl5V1s%3D",
"token": "sv=2019-02-02&sr=b&sig=5CYUJ4oHMexx19EOnooyrwpeKrbJyyDGLVMf5Sl5V1s%3D&se=2020-01-25T06%3A03%3A08Z&sp=rcw",
"storageResource": null
}
这是 Postman 发出请求的屏幕截图:
有什么想法吗?
编辑:
好的,如果我在我的 PC 上本地运行 Web API(即我在 Visual Studio 中加载解决方案并点击“开始”按钮),那么 VB 应用程序可以连接到它并且一切正常(使用 http://localhost:50504/ 代替https://propworx-api-san.azurewebsites.net)。所以我认为由于某种原因,VB 应用程序在 Azure 上时无法调用 API(但很有趣,Postman,也在我的 PC 上运行,可以)
【问题讨论】:
-
好吧,API被调用了,否则你不会有一个现有的连接被远程主机强行关闭。远程主机关闭连接,因此主机已到达。您是否尝试在 WebClient 创建连接之前简单地添加
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12或(ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)与 FW 4.0)? (您还需要手动验证服务器证书)
标签: vb.net .net-4.0 webclient webrequest webapi