HTTP错误404.0未找到 - 打开包含"#"的文件时字符

时间:2014-09-13 19:38:53

标签: asp.net

无法在浏览器上打开包含尖锐(#)字符的.PDF文件。示例:Visual C#如何编程.pdf。

下载书籍代码:

<asp:FormView ID="FormView2" runat="server">
            <ItemTemplate>
                <asp:LoginView ID="LoginView1" runat="server">
                    <LoggedInTemplate>
                            <asp:HyperLink ID="HyperLink1" ToolTip="Download book" runat="server" NavigateUrl='<%# Eval("PDFUrl") %>' Text="Download" Target="_blank"></asp:HyperLink>
                        <br />
                    </LoggedInTemplate>
                    <AnonymousTemplate>
                        <asp:LoginStatus ID="LoginStatus1" LoginText="Login" runat="server" /> or <a href="../login/register.aspx">register</a> to download book.
                    </AnonymousTemplate>
                </asp:LoginView>
            </ItemTemplate>
        </asp:FormView>

单击“下载”时,在新选项卡上显示:

HTTP错误404.0 - 未找到 您要查找的资源已被删除,名称已更改或暂时不可用。

2 个答案:

答案 0 :(得分:3)

这是因为#在网址中具有特殊含义。它标记了哈希的开头,通常用于在页面中定义锚点。

您可以使用%23转义哈希值。

最简单的方法是拨打UrlEncode

HttpUtility.UrlEncode((string)Eval("PDFUrl"))

答案 1 :(得分:2)

#是URL规范中的保留字符,因此我认为浏览器实际收到的URL并不包含:

Visual C# How to Program.pdf

但只包含:

Visual C

(因为哈希字符之后的任何内容都是用于客户端导航,所以我不认为它甚至被发送到服务器。)因此404错误。

您需要对您的值进行网址编码。自从我使用过WebForms以来已经有一段时间了,但可能会工作:

NavigateUrl='<%# HttpContext.Current.Server.UrlEncode(Eval("PDFUrl")) %>'

这是否直接在页面标记的绑定中起作用,重点仍然是您需要对URL进行URL编码。