2015-08-20 2 views
0

Я начал, сделав класс UrlHelperExtension, который построил мой URL любит этоMVC 4,5 URL.Action и маршруты

"/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.

+0

'~/Главная/DownloadFiles/файлы/1.mp3' возвратит 200 OK для вас? –

+0

Ty для вашего ответа. Я тоже получаю 404. он пытается найти файл не в том месте. мне нужно, чтобы он вызвал мой метод действий с соответствующими параметрами, а не искать файл в/Home/DownloadFiles/files, который obv не существует. – Narcil

ответ

0

Вы получаете 404, а не потому, что у вас есть проблема с вашими маршрутами (они выглядят отлично), но поскольку путь /Home/DownloadFiles/files/282.mp3 обрабатывается как статический файл, который, конечно, не существует.

Попробуйте добавить следующие строки в web.config

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

Update

Если производительность является проблемой. Добавьте это в web.config вместо:

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

Ty для вашего ответа. Это действительно работает! Но я немного беспокоюсь о производительности накладных расходов. Есть ли способ узнать, какой именно модуль должен быть загружен, а не загружать все из них? – Narcil

+0

@Narcil Да, удар с использованием первого предложения. Я обновил свой ответ с помощью другой альтернативы, попробую и посмотрю, как вы идете. –

Смежные вопросы