C# WebClient DownloadFile работает только один раз - PullRequest
2 голосов
/ 22 апреля 2020

Я создал функцию, которая загружает серию отчетов с моего веб-сайта (NET веб-формы, старое приложение), сохраняет их в виде файлов. html во временную папку, архивирует их и возвращает архив пользователю. Приложение использует windows аутентификацию, и мне удалось передать учетные данные текущего пользователя в запросе, включив

Credentials = CredentialCache.DefaultCredentials

Все работает без проблем в моей среде разработки (как в IIS Express, так и в IIS), но на рабочем сервере (Windows server 2008 R2, IIS 7.5) он работает только в том случае, если я ограничу цикл только одной итерацией. Похоже, что основное соединение WebClient остается открытым, и сервер отказывается открывать другое соединение в следующем цикле. Я получаю сообщение об ошибке:

Запрос был прерван: не удалось создать безопасный канал SSL / TLS.

и, включив трассировку WCF, я могу сузить проблему до ошибка «401 несанкционированный».

Вот важная часть моей функции:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
                                       SecurityProtocolType.Tls12 | 
                                       SecurityProtocolType.Tls11;
foreach (var project in list.Take(1)) //fails if I try list.Take(2) or more
{
    using (WebClient client = new WebClient
    {
        Credentials = CredentialCache.DefaultCredentials
    })
    {       
        UriBuilder address = new UriBuilder
        {
            Scheme = Request.Url.Scheme,
            Host = Request.Url.Host,
            Port = Request.Url.Port,
            Path = "/ERP_ProjectPrint.aspx",
            Query = string.Format("bpId={0}&bpVid={1}", project.Id, project.VersionId)
        };
        string fileName = project.VersionProtocol + ".html";
        client.DownloadFile(address.Uri.ToString(), tempFilePath + fileName);       
    }
}

Любой совет о настройках IIS, который можно настроить для решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Проблема была решена путем включения TLS 1.2 на сервере: он не был включен по умолчанию. Обратитесь к https://tecadmin.net/enable-tls-on-windows-server-and-iis/.

БУДЬТЕ ВНИМАТЕЛЬНЫ, что его включение может нарушить функциональность подключения RDP к вашему серверу.

Спасибо Jokies Ding за указание в правильном направлении (см. Комментарии выше)

0 голосов
/ 22 апреля 2020

Попробуйте переместить вас l oop в ваш запрос, как показано ниже. Это имеет значение?

Также не думайте, что вам нужно использовать list.Take

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
                                   SecurityProtocolType.Tls12 | 
                                   SecurityProtocolType.Tls11;

System.Net.ServicePointManager.DefaultConnectionLimit = 10

using (WebClient client = new WebClient
{
    Credentials = CredentialCache.DefaultCredentials
}) 
   {                                         
     foreach (var project in list) 
     {

        UriBuilder address = new UriBuilder
        {
            Scheme = Request.Url.Scheme,
            Host = Request.Url.Host,
            Port = Request.Url.Port,
            Path = "/ERP_ProjectPrint.aspx",
            Query = string.Format("bpId={0}&bpVid={1}", project.Id, project.VersionId)
        };
        string fileName = project.VersionProtocol + ".html";
        client.DownloadFileTaskAsync(address.Uri.ToString(), tempFilePath + fileName).Wait();
      }
   }
}
...