MVC Обслуживайте аудиофайлы, одновременно предотвращая прямые ссылки с использованием HttpResponseBase - PullRequest
0 голосов
/ 02 января 2011

Мне нужно иметь возможность передавать аудиофайлы в приложение mvc, не допуская прямого доступа. В идеале страница должна отображаться с помощью элемента управления проигрывателем, чтобы пользователь мог запускать / останавливать звук, связанный с записью в базе данных (аудиофайлы находятся в папке, а не в базе данных). У меня есть действие контроллера, как это:

        Response.Clear();
        Response.ContentType = "audio/wav";
        Response.TransmitFile(audioFilename);
        Response.End();
        return Response;

и представление использует метод RenderAction

<% Html.RenderAction("ServeAudioFile"); %>

это работает, но оно не будет отображаться встроенным в существующем представлении, оно открывает новую страницу только с управлением мультимедиа. Я полностью лаю не на том дереве или есть способ встроить ответ в существующее представление? работает точно так, как мне хотелось бы, но я не могу контролировать доступ к файлу.

1 Ответ

4 голосов
/ 02 января 2011

Действие вашего контроллера выглядит очень странно, можно сказать, классический код WebForms, а не ASP.NET MVC. Обычно действия контроллера возвращают ActionResult:

public ActionResult ServeAudioFile()
{
    Response.AppendHeader("Content-Disposition", "inline; filename=music.wav");
    return File(audioFilename, "audio/wav");
}

Что касается встраивания встроенного проигрывателя в браузер, вы можете взглянуть на тег <object> и указать URL этого действия контроллера (не используйте Html.RenderAction). А вот другой пример использования тега object.

Что касается предотвращения прямого доступа, это невозможно, музыкальный файл воспроизводится на клиенте, и если вы запретите доступ к нему, вы не сможете его воспроизвести. Это то же самое, что пытаться скрыть HTML вашего сайта. Это просто то, что не должно быть сделано. С другой стороны, вы можете разрешить только аутентифицированным пользователям получать доступ к этому действию контроллера, украсив его атрибутом [Authorize].

...