Ошибка «базовое соединение было закрыто» при вызове WebClient.DownloadString () из приложения. Net 4.0 в. Net Core 3.1 Web API - PullRequest
0 голосов
/ 24 января 2020

У меня есть старое приложение WinForms. Net 4.0 (в VB), которое теперь требует, чтобы оно получало некоторые данные из веб-API. Веб-API написан на. Net Core 3.1 и размещен на Azure Службе приложений.

Сначала я пытался использовать 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

Я понял, что у меня есть CORS включен в API, поэтому для этого конкретного контроллера я отключил CORS, добавив декоратор [DisableCors] в верхнюю часть контроллера, но это не имеет значения. CORS также отключен в Azure службе приложений, поэтому я не думаю, что это проблема CORS.

Эта та же самая конечная точка API вызывается из Angular 8 приложения без проблем. Это даже работает, когда я звоню из Почтальона. Но я получаю упомянутое исключение при вызове из приложения 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
}

Вот скриншот Почтальона, делающего запрос:

enter image description here

Любые идеи?

РЕДАКТИРОВАТЬ:

Хорошо, если я запускаю веб-API локально на моем P C (т.е. я загружаю решение в Visual Studio и нажимаю кнопку «Пуск»), затем приложение VB может подключиться к нему, и все работает (используя http://localhost: 50504 / вместо https://propworx-api-san.azurewebsites.net). Поэтому я думаю, что по какой-то причине приложение VB не может вызывать API, когда оно работает на Azure (но, как ни странно, почтальон, также работающий на моем P C, может)

1 Ответ

0 голосов
/ 24 января 2020

Спасибо, Джимми, за ваш комментарий. Я последовал вашему предложению и добавил следующую строку непосредственно перед строкой 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
...