Возможно ли это сделать с любым языком программирования?
Да.
можно ли сделать что-то подобное с c #?
Да.
При использовании IIS 7.0+ и с пулом приложений, настроенным для интегрированного режима, вы можете обрабатывать все запросы (запросы к файлам stati c, кроме файлов динамических c например aspx, add, sv c, et c ..)
Вы также можете сделать это во время разработки, используя IIS Express (веб-сервер по умолчанию, используемый VS 2017 для веб-проектов)
Предположим, у вас есть веб-приложение с именем сборки WebApplication1
В вашем файле web.config установите следующий атрибут (runAllManagedModulesForAllRequests
) в значение true и добавьте новый HTTP определение модуля выглядит следующим образом:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="VideoDownloadHandler" type="WebApplication1.VideoDownloadHandler"/>
</modules>
</system.webServer>
Затем реализуйте VideoDownloadHandler.cs
как класс в своем веб-проекте следующим образом: (Этот код предполагает, что у вас есть видеофайл video.mp4 в папке / vid)
using System;
using System.Web;
namespace WebApplication1
{
public class VideoDownloadHandler : IHttpModule
{
public void Dispose()
{
// Nothing to dispose
}
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpRequest request = (sender as HttpApplication).Request;
HttpResponse response = (sender as HttpApplication).Response;
HttpApplication application = sender as HttpApplication;
if (!request.Url.AbsolutePath.ToLowerInvariant().EndsWith("video.mp4"))
{
return;
}
string queryString = request.QueryString.ToString();
string videoFileName = string.IsNullOrEmpty(queryString) ? "video.mp4" : queryString + "-video.mp4";
response.ContentType = "video/mp4";
response.AddHeader("content-disposition", "attachment;filename=" + videoFileName + ";");
response.TransmitFile("~/vid/video.mp4");
response.Flush();
application.CompleteRequest();
}
}
}
Когда ваше приложение получает запрос на video.mp4, это рука во главе с вашим HttpModule, но все остальные запросы оставляются в покое для дальнейшей обработки.
Как видите, вы можете присвоить загруженному файлу любое имя (и здесь мы даем ему имя queryString + "-video.mp4"