C#WebClient下载文件只能工作一次
我构建了一个函数,可以从我的网站(.NET webforms,旧应用程序)下载一系列报告,将它们保存为.html文件,保存在临时文件夹中,将它们压缩并将存档返回给用户。 应用程序使用windows身份验证,我通过启用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)上,只有将循环
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连接,因此我无法再连接到服务器。我正在和数据中心的人一起调查