Pergunta

Eu tenho um controlador MVC chamado downloads. http: // mysite / downloads

Eu também quero colocar um arquivo físico em uma pasta física chamada http: //mysite/Downloads/MyFile.zip .

Se eu simplesmente criar uma pasta, recebo um 403 ao navegar para http: // mysite / downloads . (Muito provavelmente por causa de navegação de diretório está desativado) Mas eu quero o controlador MVC para chutar vez.

Como posso fazer isso?

Foi útil?

Solução

Se você navegar até http://mysite/Downloads/{ACTION} ele vai disparar a sua acção controladores.

A única coisa que não vai funcionar no seu exemplo é o /Downloads sem ação. Você poderia re-escrever esta URL para redirecioná-lo para a sua ação padrão.

Além disso, você precisará ter o routehandler ignorar seus arquivos de download. Você pode adicionar uma linha em seu arquivo global para ignorar todos os arquivos zip ou algum outro ignorar padrão que ternos.

routes.Ignore("{resource}.zip");

Outras dicas

Desde .NET 3.5, você pode encaminhar arquivos existente:

public static void RegisterRoutes(RouteCollection routes) {
    routes.RouteExistingFiles = true;
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", 
                          action = "Index", 
                          id = UrlParameter.Optional }
    );
}

Assim, suponha que tinha uma pasta na raiz do site chamado Markets contendo um arquivo audio.mp3:

\Markets
\Markets\audio.mp3

Assumindo a existência de um MarketsController, se fez um pedido de Markets, seria encaminhado para Markets/Index.

Se solicitado /Markets/audio.mp3 teríamos o arquivo mp3 e se solicitado Markets/AnythingElse, rota normal seria aplicável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top