【问题标题】:MVC 4.5 URL.Action and routesMVC 4.5 URL.Action 和路由
【发布时间】:2015-08-20 23:07:05
【问题描述】:

我首先创建了一个 UrlHelperExtension 类来构建我的 url,就像这样

"/Home/DownloadFiles?directory="+directory+"&filename"+HttpUtility.UrlEncode(filename)

但我想为什么不使用 mvc 来构建我的 URL,所以在我看来我做到了

href="@Url.Action("DownloadFiles","Home", new {directory = "files", filename="1.mp3"}"

但输出 /Home/DownloadFiles/files/1.mp3 找不到文件(我得到 404)。我的操作方法是

public ActionResult DownloadFiles(string directory, string filename){
  //log which file is downloaded by who
  //Add download header content-disposition attachement
  //Send response with the file
  return null;
}

我唯一的路线是这样的

routes.MapRoute(
  name:"Default",
  url: "{controller}/{action}/{directory}/{filename}",
  defaults: new {controller = "Home", action = "Index", directory = UrlParameter.Optional, filename = UrlParameter.Optional}
)

我认为我在真正理解路线方面存在一些问题,因为我不确定如何解决这个问题,所以我不必使用我的扩展类,它真的没有多大作用。也许我不应该使用 URL.Action ?将 Url.Action UrlEncode 文件名参数?目录参数只有 1 个“深”,所以它不能是 abc/def 只有 abc,我添加了相关部分,所以我不担心 UrlEncoding 它。

【问题讨论】:

  • ~/Home/DownloadFiles/files/1.mp3 将为您返回 200 OK?
  • 为您解答。我也得到一个404。他试图在错误的地方寻找文件。我需要它用正确的参数调用我的操作方法,而不是在 /Home/DownloadFiles/files 中查找 obv 不存在的文件。

标签: asp.net-mvc asp.net-mvc-4 routes razor-2


【解决方案1】:

您收到 404,不是因为您的路线有问题(它们看起来不错),而是因为路径 /Home/DownloadFiles/files/282.mp3 正在作为静态文件处理,这当然不存在。

尝试将以下内容添加到您的web.config

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
</configuration>

更新

如果性能是一个问题。将此添加到您的 web.config 中:

<system.webServer>
  <handlers>
    <add name="Mp3FileHandler" path="*.mp3" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

【讨论】:

  • 回答您的问题。这确实有效!但我有点担心性能开销。有没有办法准确找出应该加载哪个模块而不是加载所有模块?
  • @Narcil 是的,使用第一个建议会影响性能。我已经用另一种选择更新了我的答案,试试看,看看你怎么样。
猜你喜欢
  • 2011-12-17
  • 2020-02-01
  • 2015-09-29
  • 2016-07-16
  • 2015-05-02
  • 1970-01-01
  • 2014-10-21
  • 2013-06-23
  • 2020-12-28
相关资源
最近更新 更多