C#WebClient下载文件只能工作一次

C#WebClient下载文件只能工作一次,c#,asp.net,iis,windows-authentication,webclient-download,C#,Asp.net,Iis,Windows Authentication,Webclient Download,我构建了一个函数,可以从我的网站(.NET webforms,旧应用程序)下载一系列报告,将它们保存为.html文件,保存在临时文件夹中,将它们压缩并将存档返回给用户。 应用程序使用windows身份验证,我通过启用 Credentials = CredentialCache.DefaultCredentials 在我的开发环境中(无论是在IIS Express中还是在IIS上),一切都可以无缝地工作,但在生产服务器(Windows server 2008 R2,IIS 7.5)上,只有将循环

我构建了一个函数,可以从我的网站(.NET webforms,旧应用程序)下载一系列报告,将它们保存为.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设置的任何提示,我可以调整以解决此问题吗?

尝试将您的循环移动到您的请求中,如下所示。这有区别吗

也不要认为你需要使用列表。拿

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();
      }
   }
}

通过在服务器上启用TLS 1.2,该问题已得到解决:默认情况下未启用。参考

请注意,启用它可能会中断与服务器的RDP连接功能


感谢丁开玩笑为我指出了正确的方向(见上面的评论)

谢谢你的回答!我已经试过了,但没什么区别。Take(2)只是为了限制下载的报告数量,加快调试速度,但没有起作用。这两次尝试都没有:wait client.downloadfiletasksync(address.Uri.ToString(),tempFilePath+fileName)@Chunk_ITA你能试试看ServicePointManager设置是否有效吗?可能需要增加一点数字,这似乎是schannel的问题。由于Schannel已退出IIS,我不确定它是否会被IIS配置修复。您是否可以启用日志并发布有关此问题的更多错误消息?此外,IIS 401中详细的错误消息是什么?是否启用了加载用户档案器?是!记录一个schannel错误:“生成了以下致命警报:70。内部错误状态为105。”事件ID:36888。我正在调查……这听起来确实像是一个schannel问题,尤其是当代码在其他人的机器上运行良好时。您是否尝试过使用IIS加密修改您的schannel密码套件、协议等?如果您记录代码的崩溃转储,您应该能够通过WIN32 API查看真正的内部异常thrwon。您为我指明了正确的方向!我发现我的服务器(Win2008R2)上禁用了TLS 1.2。启用它后,页面可以无缝地工作。不幸的是,这以某种方式破坏了RDP连接,因此我无法再连接到服务器。我正在和数据中心的人一起调查