asp.net-mvc-3 - ASP.NET MVC 3:当id为文件名时,如何查找 Controller 而不是文件

标签 asp.net-mvc-3 download asp.net-mvc-routing

我遇到了一些奇怪的问题。这对我来说很奇怪,因为我不理解它,并且因为一切都还不错。因此,我的任务是调用 Controller 并传递文件名(带有扩展名), Controller 应识别该文件,写入日志,然后返回文件本身(如果存在)(在“下载”文件夹中)。我在做什么:

public class DownloadController : Controller
{
    public ActionResult Files(string id)
    {
        string filePath = Server.MapPath(Url.Content(string.Format("~/Downloads/{0}", id)));
        string serverPath = Url.Content(string.Format("~/Downloads/{0}", id));
        string ext = Path.GetExtension(filePath);
        if (!System.IO.File.Exists(filePath))
        {
            //return to the error controller
        }
        string mem = "text/html";
        if (ext == ".zip")
        {
            mem = "application/x-zip-compressed";
        }
        else if (ext == ".html" || ext == ".htm")
        {
            mem = "text/html";
        }
        else if (ext == ".pdf")
        {
            mem = "application/pdf";
        }
        //Save info about downloads into DB
        repStat.SaveStatInfo(id, HttpContext.Request.UserHostAddress,
        HttpContext.Request.UserHostName, HttpContext.Request.UserAgent);
        return File(serverPath, mem, id);
    }
}

Global.asax有一部分:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("Content/{*pathInfo}");

它没有更多的“忽略”。

因此,问题是当我在打电话时:mysite.com/download/files/test.pdf服务器返回我“找不到页面”。当然,下载/文件路径中没有这样的文件!它应该调用 Controller ,而不是实际文件。删除mysite.com/download/files/test之类的扩展名后,服务器即会调用 Controller 。我不明白为什么它不能将文件名识别为参数,而是试图查找文件。

如果我尝试使用其他 Controller ,则绝对存在相同的行为-参数不具有任何扩展名后,它就可以正常工作,否则服务器会寻找文件。

最奇怪的是,一切在本地都可以正常运行,但在服务器上却无法正常工作(工作时间不长,然后就停止了)。

最佳答案

我也觉得很奇怪。一种解决方法是对点(.)进行编码,例如,

test.pdf -> test++pdf

然后解码,然后解码回去。

可能不是最好的解决方案,但肯定会解决问题。

关于asp.net-mvc-3 - ASP.NET MVC 3:当id为文件名时,如何查找 Controller 而不是文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8691689/

相关文章:

jquery .html 刷新在 Chrome 上不起作用

git - 从 BitBucket 下载 Git 存储库

c# - ASP.NET Web API 获取子列表(分层资源)

java - Java中下载文件失败的处理方法

c# - 根据不起作用的角色重定向到操作。也许需要路由?

c# - ASP.NET MVC 3 自定义 RouteBase 和 OutputCache

asp.net-mvc-3 - 是否可以从 @Html.ActionLink 调用 HttpPost Action 方法?

asp.net - 如何将错误从一个操作传递到另一个操作

asp.net-mvc - MVC3模型代码中的Html文字

bash - 对下载文件的执行权限