0

我有一个旧的 .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(但很有趣,邮递员,也在我的 PC 上运行,可以)

4

1 回答 1

1

谢谢吉米的评论。我听从了您的建议,并在 client.DownloadString(uri) 行之前添加了以下行:

ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType

它奏效了!所以代码现在看起来像这样:

Dim uri As String = $"{apiUrl}/AzureStorage/Sas?section={section}&recordId={recordId}&filename={filename}"

Using client As New WebClient()
    client.Headers.Add("clientId", clientId.ToString())
    ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType
    Dim response As String = client.DownloadString(uri)
End Using
于 2020-01-24T08:29:09.280 回答