Consegui resolver esse problema criando um manipulador especificamente para verificar se o pedido tem um intervalo e depois dar uma resposta com o intervalo e os cabeçalhos necessários.
No HTML, foi necessário adicionar o seguinte em cada endereço dos arquivos que eu quero permitir solicitações de intervalo:
<source src="PartialHandler.ashx?arquivos/video.webm" />
O PartialHandler.ashx contém o seguinte ProcessRequest:
public void ProcessRequest(HttpContext context)
{
string a = Uri.UnescapeDataString(context.Request.Url.Query);
if (a.StartsWith("?", StringComparison.InvariantCultureIgnoreCase))
{
a = a.Substring(1);
}
Console.WriteLine(a);
if (a == null || a == "")
{
context.Response.StatusCode = 403;
context.Response.End();
return;
}
Console.WriteLine(a);
FileInfo aberto;
long tam_tot;
long tam_tot_ran;
try
{
aberto = new FileInfo(HttpRuntime.AppDomainAppPath + a);
tam_tot = aberto.Length;
tam_tot_ran = tam_tot - 1;
context.Response.AppendHeader("Accept-Ranges", "0-" + tam_tot_ran);
context.Response.AppendHeader("Content-Type", MimeMapping.GetMimeMapping(a));
}
catch (FileNotFoundException)
{
context.Response.StatusCode = 404;
context.Response.End();
return;
}
string allhead = context.Request.Headers.ToString();
if (allhead.Contains("Range=bytes"))
{
var pedido = context.Request.Headers.Get("Range");
if (pedido.Contains(","))
{
context.Response.StatusCode = 416;
context.Response.End();
return;
}
Console.WriteLine(pedido); //bytes=5-15
long end_igual = pedido.IndexOf("=", StringComparison.InvariantCultureIgnoreCase);
long end_traco = pedido.IndexOf("-", StringComparison.InvariantCultureIgnoreCase);
string tam_ini_str = pedido.Substring((int)end_igual + 1, (int)end_traco - 1 - (int)end_igual);
string tam_fin_str = pedido.Substring((int)end_traco + 1);
long.TryParse(tam_ini_str, out long tam_ini);
long.TryParse(tam_fin_str, out long tam_fin);
if (tam_fin > tam_tot_ran)
{
context.Response.StatusCode = 416;
context.Response.End();
return;
}
context.Response.StatusCode = 206;
if (tam_fin == 0)
{
context.Response.AppendHeader("Content-Length", (tam_tot - tam_ini).ToString());
context.Response.AppendHeader("Content-Range", "bytes " + tam_ini + "-" + tam_tot_ran + "/" + tam_tot.ToString());
context.Response.TransmitFile(aberto.FullName, tam_ini, tam_tot_ran);
context.Response.End();
}
else
{
context.Response.AppendHeader("Content-Length", (tam_fin - tam_ini + 1).ToString());
context.Response.AppendHeader("Content-Range", "bytes " + tam_ini + "-" + tam_fin + "/" + tam_tot.ToString());
context.Response.TransmitFile(aberto.FullName, tam_ini, tam_fin);
context.Response.End();
}
}
else
{
context.Response.AppendHeader("Content-Length", aberto.Length.ToString());
context.Response.TransmitFile(aberto.FullName);
context.Response.End();
}
}
Com isso, todos os vídeos funcionaram em todos os dispositivos que testei, todo o re-download de todos os arquivos de vídeo toda vez que ele foi pausado ou em uso não está mais acontecendo e os dispositivos móveis podem reproduzi-los.