【问题标题】:How to download a file and immediately serve it to the client in ASP.NET?如何在 ASP.NET 中下载文件并立即将其提供给客户端?
【发布时间】:2009-06-22 20:06:07
【问题描述】:

基本上,我需要从需要 Windows 身份验证的位置提供文件。当然,我不想让我的客户直接处理它,而是想实现一个过程,以便他们可以像在我的服务器上一样简单地下载文件,当然,在他们登录到我的系统之后。这是我目前所拥有的,似乎无法正常工作:

// Create the request
WebRequest request = HttpWebRequest.Create(button.CommandArgument);
request.Credentials = new NetworkCredential(_username,_password);


// Get the response
WebResponse response = request.GetResponse();
StreamReader responseStream = new StreamReader( response.GetResponseStream());

// Send the response directly to output
Response.ContentEncoding = responseStream.CurrentEncoding;
Response.ContentType = request.ContentType;
Response.Write(responseStream.ReadToEnd());
Response.End();

当我尝试这个时,我可以查看文件,但编码或内容类型有问题,例如,PDF 将包含 16 个空白页(而不是 16 页文本)。

知道我错过了什么吗?

如果有更好的表述方式,请随时更改此问题的标题

更新: 尝试了下面的两个响应,但没有运气。我现在认为内容类型和编码都可以,但可能身份验证失败?内容长度比实际应该小很多...我是否使用了错误的 Windows 身份验证方法?

【问题讨论】:

  • 你应该检查你从内部请求中得到了什么。也许您正在从服务器以错误页面的形式返回 HTML。

标签: asp.net file file-io download windows-authentication


【解决方案1】:

取决于你如何/拥有什么。我会做一些事情。

Response.Clear() 首先删除任何可能已渲染的内容。

然后我会添加一个标头,设置内容处置并将其作为实际附件发送,而不是仅仅将其写给用户。

【讨论】:

  • 我尝试将 Response.Clear() 放在我的电话之前,但它似乎没有帮助。标题我还没试过。
  • 没有骰子。 Content_Disposition 也不起作用。你还有什么好办法吗?
  • 我现在要尝试的是隔离问题。尝试保存响应,并确保首先获取文件。然后,如果您是,请处理响应部分。
【解决方案2】:

您似乎在最后一个代码块中发送了错误的内容类型。您发送的是用户原始请求的类型,而不是您检索到的文件的内容类型。改变这个:

Response.ContentType = request.ContentType;

到:

Response.ContentType = response.ContentType;

【讨论】:

  • 不,不走运。它正确设置了内容类型,但是当我通过 FireFox Web Developer Toolbar 检查标题时,它设置为 text/html... 很奇怪。
  • 也许您正在返回一个 text/html 错误页面。您应该能够在调试时检查响应流中返回的内容,或者使用 Wireshark 确定。
【解决方案3】:

如果您的问题与网络凭据有关,您可能需要尝试不同的方法。如果您授予对网站应用程序池正在使用的身份的 HTTP 访问权限,则可以避免在请求中指定用户名/密码凭据。这还为您带来了额外的好处,即无需将密码存储在某处。

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多